计算字符串中不带反斜杠的引号数

时间:2014-02-28 14:31:06

标签: php regex preg-match-all

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

\"

我希望它返回6,但它只返回$subStr = 'asdf"asdf""a\\"sdf\'asdf\'\'a\\\'sdf'; preg_match_all('/[^\\\\]\'|[^\\\\]\"/', $subStr, $matches); echo count($matches[0]); 。我认为这是因为字符串4""只计算一次。

这是''包含的内容:

$matches

有什么方法可以得到Array ( [0] => Array ( [0] => f" [1] => f" [2] => f' [3] => f' ) ) 的数量吗?请注意,我还需要排除6\"

4 个答案:

答案 0 :(得分:2)

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

可替换地:

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

更新:如果您要转发\'\"

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

答案 1 :(得分:2)

为什么不起作用

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

解决方案

如果你想匹配一个前面没有反斜杠的单引号或双引号字符,那么你将不得不使用一个环视表达式(特别是负面的lookbehind)。

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

<强>尸检:

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

视觉表现:

Visual Representation of the regex

这有效地匹配任何单引号/双引号字符前面有文字反斜杠字符。

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

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

Demo

答案 2 :(得分:0)

当然,你也可以选择非正则表达式方法:

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

答案 3 :(得分:-1)

试试这个......

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

Demo