Комментарий Regex Match PHP

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

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

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

Я также попробовал

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

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

Solutions Collecting From Web of "Комментарий Regex Match PHP"

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

Пытаться

 //[^<]+ 

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

Чтобы соответствовать комментариям, вы должны думать, что в 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'; //*/ 

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

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


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

См. Ссылки:

  • token_get_all
  • List of Parser Tokens

При этом вам нужно будет использовать токенизатор в вашей строке кода 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 

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

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

Вероятно, вам нужно избежать «//»:

 \/\/([^<]+) 

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

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

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