我正在使用以下表达式查找字符串中'
和"
的出现次数我不希望计数包括\'
或{{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
和\"
。
答案 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表达式的结尾[\'"]
- 与列表"'
视觉表现:
这有效地匹配任何单引号/双引号字符不前面有文字反斜杠字符。
将上述表达式与preg_match_all
一起使用很简单:
$subStr = 'asdf"asdf""a\\"sdf\'asdf\'\'a\\\'sdf';
preg_match_all('/(?<!\\\\)[\'"]/', $subStr, $matches);
echo count($matches[0]); // => 6
答案 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]);