【问题标题】:PHP: Regex match string not preceeded by a dollar signPHP:正则表达式匹配字符串前面没有美元符号
【发布时间】:2011-07-18 23:26:43
【问题描述】:

在我的语法荧光笔中,我使用正则表达式来解析不同的术语。下面是我如何解析 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 的变量,它匹配得很好。

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

【问题讨论】:

    标签: php regex operator-precedence


    【解决方案1】:

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

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

    【讨论】:

    • 没问题。如果您在使用 RegEx 时遇到问题,请尝试检查 regular-expressions.info - 它包含一个非常方便的参考。
    【解决方案2】:

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

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

    /[ ]+{$class}\b/
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-16
        • 2021-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-15
        • 1970-01-01
        • 2018-06-12
        相关资源
        最近更新 更多