2011-07-18 47 views
0

在我的语法突出显示器中,我使用正则表达式来解析不同的术语。下面是我如何解析PHP类: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的变量,它就会很好地匹配。

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

回答

4

您可以使用负的零宽度后视图来完成相同的任务 - 基本上,要确保不是之前的文字:/(?<!\$){$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

感谢,伟大工程! :) –

+0

没问题。如果遇到RegEx问题,请尝试检查http://regular-expressions.info/ - 它包含一个非常方便的参考。 – Nightfirecat

0

你想匹配className吗?即class className {}$foo = new className

如果是这样你可以检查类名之前的一个或多个空格:

/[ ]+{$class}\b/ 
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"; 
    }