W moim podświetlaczu składni używam wyrażenia regularnego do analizowania różnych terminów. Poniżej znajduje się jak parsuję klasy PHP:

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

Teraz po prostu zignoruj ​​klasę PHP i funkcję _getHtmlCode. Wyrażenie regularne "/\b{$class}\b/" pasuje do nazw takich jak count. Jeśli tworzę zmienną o nazwie $count, pasuje ona do tego dobrze.

Jak mogę znaleźć nazwy klas, które nie są poprzedzone $?

0
Nahydrin 19 lipiec 2011, 03:26

3 odpowiedzi

Najlepsza odpowiedź

Możesz użyć ujemnego spojrzenia wstecz o zerowej szerokości, aby wykonać to samo zadanie - zasadniczo, aby upewnić się, że nie ma znaku dolara przed tekstem: /(?<!\$){$class}/.

(?<!     # Non-capturing look-behind group, captures only if the following regex is NOT found before the text.
  \$)    # Escaped dollar sign
{$class} # Class name
5
Nightfirecat 19 lipiec 2011, 03:34
Żaden problem. Jeśli napotkasz problemy z RegEx, spróbuj zajrzeć do regular-expressions.info – zawiera naprawdę przydatne odniesienie .
 – 
Nightfirecat
19 lipiec 2011, 04:17

Czy próbujesz dopasować className? tj. class className {} lub $foo = new className

Jeśli tak, możesz sprawdzić co najmniej jedną spację przed nazwą klasy:

/[ ]+{$class}\b/
0
Glass Robot 19 lipiec 2011, 03:37

Ciekawe, że $ liczy się jako granica, czyż nie. W każdym razie, jedną poprawką jest umieszczenie tego po \b:

(?<!\$)

Zobacz http://www.php.net/manual/en/regexp. reference.assertions.php, co to oznacza

Oto skrypt testowy, który to demonstruje:

$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
Darren Cook 19 lipiec 2011, 03:46