2010-08-14 3 views
2

Я пытаюсь извлечь все подстроки в строке, которая находится между строками/* и * /. Я знаю, что это, вероятно, нужно будет делать с регулярными выражениями, но мне сложно получить правильное регулярное выражение, поскольку символ звезды фактически используется для обозначения повторяющихся символов. Я пытаюсь использовать метод preg-match в PHP, вот что я до сих пор придумал, но мне не очень повезло.Regex в PHP между/* & */для preg-match

<?php 
    $aString = "abcdef/*ghij*/klmn/*opqrs*/tuvwxyz"; 
    preg_match("/*/.*/", $aString, $anArray); 

    for ($i = 0; $i < count($anArray); i++) 
     echo $anArray[i] . "\n"; 
?> 
+0

Вы разве не происходит синтаксический анализ блоков комментариев из исходного кода PHP? –

+0

Я пытаюсь создать форматировщик php-кода для отображения php-кода с помощью HTML – jazzdawg

+0

Вы пробовали свой код, прежде чем публиковать его здесь? Существуют такие основные ошибки, как: i -> $ i, о которых должен сообщать php parser. –

ответ

0

Рабочий код:

$aString = "abcdef/*ghij*/klmn/*opqrs*/tuvwxyz"; 

// SIMPLE VERSION WHERE ASTERISK MAY NOT BE IN THE COMMENT 
// \/\* is just escape sequence for /* 
// [^\*]* - in comment may be whatever except * (asterisk) 
// \*\/ is escape sequence for */ 
preg_match_all("#\/\*[^\*]*\*\/#", $aString, $anArray); 

// BETTER VERSION 
// http://www.regular-expressions.info/refadv.html - for explanation of ?: and ?! 
preg_match_all("#\/\*" . "((?:(?!\*\/).)*)" . "\*\/#", $aString, $anArray); 


var_dump($anArray); // easier for debugging than for-loop 

Выход для лучшей версии:

array(2) { 
    [0]=> 
    array(2) { 
    [0]=> 
    string(8) "/*ghij*/" 
    [1]=> 
    string(9) "/*opqrs*/" 
    } 
    [1]=> 
    array(2) { 
    [0]=> 
    string(4) "ghij" 
    [1]=> 
    string(5) "opqrs" 
    } 
} 
+0

Спасибо, очень хорошо работает – jazzdawg

+0

Если я поставил звезду где-то там (то есть: '/ * gh * ij *'), это сработает – NullUserException

+0

@NullUserException: Да, я знал об этом, и я добавил новую версию, которая должна работать лучше. –

0

побег * использовать его, и рекламные скобки, чтобы захватить содержимое вроде: /\*(.*)\*/, и вы должны использовать preg_match_all найти все совпадения в строке.

(и проще, чем ФОР, используйте var_dump($anArray))

0
$aString = "abcdef/*ghij*/klmn/*opqrs*/tuvwxyz"; 
preg_match_all("/\/\*(.*?)\*\//", $aString, $anArray,PREG_SET_ORDER); 
var_dump($anArray); 
0

Если (как вы говорите в одном из комментариев) вы пытаетесь отобразить PHP-код в HT ML есть фактически встроенная функция (highlight_file), которая делает именно это.

Free свободно игнорировать, если вы используете это в качестве учебного упражнения и т.д. :-)

1

Чтобы извлечь комментарий разделов из PHP кода, используйте Tokenizer.

token_get_all() проанализирует код и вернет массив элементов.

Комментарии будут представлены как T_COMMENT элементов.

Это имеет большое преимущество, улавливать все возможные способы, имеющие комментарии в PHP код:

/* This way, */ 

// This way 

# and this way 
+0

Спасибо, я посмотрю, что – jazzdawg

+1

Более важно: он не даст вам ложных срабатываний, как в '$ str ="/* foo */";' – Gumbo

+0

@Gumbo хорошая точка. –

0

Я думаю, что регулярное выражение будет просто

\/\*.*?\*\/ 

здесь демо рабочего кода, используя регулярное выражение тестер

http://liveregex.com/WoDbk

Смежные вопросы