PHP:正则表达式匹配字符串前面没有美元符号

时间:2011-07-18 23:26:44

标签: php regex ignore operator-precedence

在我的语法荧光笔中,我使用正则表达式来解析不同的术语。下面是我解析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 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

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

如果是这样,您可以在classname之前检查一个或多个空格:

/[ ]+{$class}\b/

答案 2 :(得分:0)

好奇$计为边界不是它。 无论如何,一个解决方法是将其放在\ 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";
    }