2011-07-18 50 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"; 
    }