PHP: строке соответствия регулярного выражения не предшествует знак доллара - PullRequest
0 голосов
/ 19 июля 2011

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

foreach ( PHP::$Classes as $class )
    $code = preg_replace( "/\b{$class}\b/", $this->_getHtmlCode( $class, PHP::$Colors['class'] ), $code );

Теперь просто игнорируйте класс PHP и функцию _getHtmlCode.Регулярное выражение "/\b{$class}\b/" соответствует именам, таким как count.Если я создаю переменную с именем $count, она соответствует этому.

Как мне искать имена классов, которым не предшествует $?

Ответы [ 3 ]

5 голосов
/ 19 июля 2011

Вы могли бы использовать отрицательный просмотр нулевой ширины для выполнения той же задачи - в основном, чтобы убедиться, что не знак доллара перед вашим текстом: /(?<!\$){$class}/.

(?<!     # Non-capturing look-behind group, captures only if the following regex is NOT found before the text.
  \$)    # Escaped dollar sign
{$class} # Class name
0 голосов
/ 19 июля 2011

Любопытно, что $ считается границей, не так ли? В любом случае, одно из исправлений - поместить это после \ b:

(?<!\$)

См. http://www.php.net/manual/en/regexp.reference.assertions.php, что это значит

Вот тестовый скрипт, который демонстрирует это:

$list=array(
    'class MyClass',
    'class HisClass',
    'var $MyClass',
    );

foreach($list as $s){
    echo $s."\n";
    if(preg_match('/\bMyClass\b/',$s))echo "OK";else echo "Failed";
    echo "\n";
    if(preg_match('/\b(?<!\$)MyClass\b/',$s))echo "OK";else echo "Failed";
    echo "\n";
    }
0 голосов
/ 19 июля 2011

Вы пытаетесь соответствовать className? т.е. class className {} или $foo = new className

Если это так, вы можете проверить один или несколько пробелов перед именем класса:

/[ ]+{$class}\b/
...