【问题标题】:Count the number of quotes in a string that's not preceded by a backslash计算字符串中前面没有反斜杠的引号的数量
【发布时间】:2014-02-28 14:31:06
【问题描述】:

我正在使用以下表达式来查找字符串中'" 的出现次数我不希望计数包括\'\"

$subStr = 'asdf"asdf""a\\"sdf\'asdf\'\'a\\\'sdf';
preg_match_all('/[^\\\\]\'|[^\\\\]\"/', $subStr, $matches);
echo count($matches[0]);

我希望它返回 6,但它只返回 4。我认为这是因为字符串 ""'' 只计算一次。

这是$matches 包含的内容:

Array
(
    [0] => Array
        (
            [0] => f"
            [1] => f"
            [2] => f'
            [3] => f'
        )

)

有什么方法可以得到6 的计数吗?请注意,我还需要排除 \"\'

【问题讨论】:

    标签: php regex preg-match-all


    【解决方案1】:

    为什么不行

    您不能使用字符类来匹配前面没有其他字符的字符。这是因为一个字符类(是否否定)必须仍然匹配一个字符。例如,[^a]b 并不意味着“b 前面没有a”。这意味着:“不是a 后跟b 的字符”。

    解决方案

    如果要匹配前面没有反斜杠的单引号或双引号字符,则必须使用环视表达式(特别是否定的环视)。

    您要查找的正则表达式是(?<!\\\\)[\'"]

    尸检:

    • (?<! - 后向表达式的开始
      • \\\\ - 匹配文字反斜杠字符
    • ) - 后向表达式结束
    • [\'"] - 匹配列表中单个字符的字符类 "'

    视觉表现:

    这有效地匹配任何以文字反斜杠字符开头的单引号/双引号字符。

    将上述表达式与preg_match_all 一起使用很简单:

    $subStr = 'asdf"asdf""a\\"sdf\'asdf\'\'a\\\'sdf';
    preg_match_all('/(?<!\\\\)[\'"]/', $subStr, $matches);
    echo count($matches[0]); // => 6
    

    Demo

    【讨论】:

      【解决方案2】:
      preg_match_all('/([\'"])/', $subStr, $matches);
      

      交替:

      print count(preg_split('/[\'"]/', $subStr)) - 1;
      

      更新:如果你想逃避\'\"

      preg_match_all('/(?<!\\\)([\'"])/', $subStr, $matches);
      

      【讨论】:

      • 嗨,我正在尝试排除 \' 和 \" 所以如果我使用此代码,它将返回 8
      【解决方案3】:

      当然,您也可以采用非正则表达式方法:

      $number = substr_count($string, '"') + substr_count($string, "'");
      

      【讨论】:

      • 嗨,我想排除 \' 和 \" 所以如果这在字符串中 ' 和 " 将不计算在内。这就是我使用 reg 的原因
      【解决方案4】:

      试试这个...

      $subStr = 'asdf"asdf""asdf\'asdf\'\'asdf';
      preg_match_all('/["\']/', $subStr, $matches);
      echo count($matches[0]);
      

      Demo

      【讨论】:

        猜你喜欢
        • 2017-12-13
        • 2010-10-13
        • 1970-01-01
        • 1970-01-01
        • 2014-07-26
        • 1970-01-01
        • 2011-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多