2009-07-27 4 views
0

Я пытаюсь сопоставить комментарии PHP с помощью регулярных выражений.Regex Match PHP Комментарий

//([^<]+)\r\n 

То, что ive получил, но на самом деле это не работает.

Ive также попытался

//([^<]+)\r 
//([^<]+)\n 
//([^<]+) 

... но безрезультатно

+2

Не могли бы вы получить более подробную информацию о том, чего вы пытаетесь достичь, на каком языке вы соответствуете этому * от *. – Draemon

ответ

0

Вы, вероятно, нужно бежать "//":

\/\/([^<]+) 
+0

Он соответствует только одному комментарию. Он не найдет их всех в документе. –

+0

Вы не просили об этом. Но это не имеет никакого смысла. Режимы применимы только к * строке * (вообще говоря). Если вы пропустите каждую строку через это регулярное выражение, тогда он может делать то, что вы хотите. Что вы на самом деле пытаетесь сделать? – Draemon

1

В какой программе вы кодирования это регулярное выражение ? Ваш последний пример - хорошая проверка здравомыслия, если вы обеспокоены тем, что символы новой строки не работают. (Я понятия не имею, почему вы не позволяете менее чем в ваш комментарий,. Я предполагаю, что это специфичные для вашего приложения)

Попробуйте

//[^<]+ 

и посмотреть, если это работает. Как говорит Дремон, вам, возможно, придется избегать диагоналей. Возможно, вам также придется избегать круглых скобок. Я не могу сказать, знаете ли вы это, но круглые скобки часто используются для включения групп захвата . Наконец, проверьте, действительно ли по крайней мере один символ после двойных косых черт.

1

Чтобы соответствовать комментарии, вы должны думать, что есть два типа комментариев в PHP 5:

  • комментарии, которые начинаются от // и идут до конца строки
  • комментарии, которые начинаются от /* и перейти к */

Учитывая у вас есть эти две линии: первая

$filePath = '/home/squale/developpement/astralblog/website/library/HTMLPurifier.php'; 
$str = file_get_contents($filePath); 

Вы могли бы соответствовать первому из них с:

$matches_slashslash = array(); 
if (preg_match_all('#//(.*)$#m', $str, $matches_slashslash)) { 
    var_dump($matches_slashslash[1]); 
} 

, а второй из них с:

$matches_slashstar = array(); 
if (preg_match_all('#/\*(.*?)\*/#sm', $str, $matches_slashstar)) { 
    var_dump($matches_slashstar[1]); 
} 

Но вы, вероятно, попасть в неприятности с «//» в середине строки (what about heredoc syntax, btw, did you think about that one ?), или «переключить комментарии», как это:

/* 
echo 'a'; 
/*/ 
echo 'b'; 
//*/ 

(Просто добавьте косую черту на быть gining к «тумблеры» два блока, если вы не знаете, трюк)

Итак ... Довольно трудно обнаружить комментарии только регулярное выражение ...


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

Для справки, см:

При том, что вы должны использовать Tokenizer на вашей строке PHP кода, итерацию по всем токенов вы получите в результате, и определить, какие из них являются комментариями.

Нечто подобное, вероятно, сделать:

$tokens = token_get_all($str); 

foreach ($tokens as $token) { 
    if ($token[0] == T_COMMENT 
     || $token[0] == T_DOC_COMMENT) { 
     // This is a comment ;-) 
     var_dump($token); 
    } 
} 

И, как выход, вы получите список вещей, как это:

array 
    0 => int 366 
    1 => string '/** Version of HTML Purifier */' (length=31) 
    2 => int 57 

или это:

array 
    0 => int 365 
    1 => string '// :TODO: make the config merge in, instead of replace 
' (length=55) 
    2 => int 117 

(Вы «просто» можете раздеть // и /* */, но это вам решать ; по крайней мере, вы извлекли комментарии ^^)

Если вы действительно хотите, чтобы обнаружить комментарии без какого-либо странных ошибок из-за «странный» синтаксис, я полагаю, это будет путь ;-)

0

Это будет соответствовать комментарии в PHP (как/* */и // формат)

/(\/\*).*?(\*\/)|(\/\/).*?(\n)/s 

чтобы получить все матчи, использовать preg_match_all, чтобы получить массив матчей.