Я пытался сопоставить PHP-комментарии с помощью регулярных выражений.
//([^<]+)\r\n
То, что ive получил, но на самом деле это не работает.
Я также попробовал
//([^<]+)\r //([^<]+)\n //([^<]+)
…но безрезультатно
В какой программе вы кодируете это регулярное выражение? Ваш последний пример – хорошая проверка здравомыслия, если вы обеспокоены тем, что символы новой строки не работают. (Я понятия не имею, почему вы не допускаете меньше, чем в своем комментарии, я предполагаю, что это специфично для вашего приложения.)
Пытаться
//[^<]+
и посмотреть, работает ли это. Как говорит Дремон, вам, возможно, придется избегать диагоналей. Возможно, вам также придется избегать круглых скобок. Я не могу сказать, знаете ли вы это, но круглые скобки часто используются для включения групп захвата . Наконец, проверьте, действительно ли по крайней мере один символ после двойных косых черт.
Чтобы соответствовать комментариям, вы должны думать, что в 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, чтобы получить массив совпадений.