Regex匹配字符串前面没有美元符号


PHP: Regex match string not preceeded by a dollar sign

在我的语法高亮显示中,我使用regex来解析不同的术语。下面是我解析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的变量,它就匹配得很好。

如何查找前面没有$的类名?

您可以使用负零宽度后看来完成相同的任务-基本上,确保在文本前没有美元符号:/(?<!'$){$class}/

(?<!     # Non-capturing look-behind group, captures only if the following regex is NOT found before the text.
  '$)    # Escaped dollar sign
{$class} # Class name

是否尝试匹配className?即class className {}$foo = new className

如果是这样,可以检查classname前是否有一个或多个空格:

/[ ]+{$class}'b/

奇怪的是,$算一个边界,不是吗?无论如何,一种修复方法是将它放在'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";
    }