我正在尝试计算字符串中字符的出现次数。 例如:
$string = "ab abc acd ab abd";
$chars = "ab";
$chars
中$string
完全出现了多少次,正确答案是2次,但substr_count()
则返回3次!!!
有没有返回正确答案的PHP函数或Regex?
答案 0 :(得分:5)
使用正则表达式,您可以执行以下操作:
$count = preg_match_all('/\bab\b/', $string);
它会计算单词" ab "的出现次数。正则表达式中的\b
表示非单词字符和单词字符之间的位置。
A" 字"字符是任何字母或数字或下划线字符。
答案 1 :(得分:1)
对于你已经在评论中说过的内容,你并没有试图找到一个确切的词,因为一个词有特定的界限。所以你要做的就是这样:
/(?:\A|[^H])HH(?:[^H]|\z)/g
preg_match_all('/(\A|[^H])HH([^H]|\z)/', $string, $matches);
或问题的例子:
/(?:\A|[^a])ab(?:[^b]|\z)/g
preg_match_all('/(?:\A|[^a])ab(?:[^b]|\z)/', $string, $matches);
<强>解释强>:
(?: \A | [^a] ) # very beginning of the input string OR a character except `a`
ab # match `ab`
(?: [^b] | \z ) # end of the input string OR a character except `b`
<强> Live demo 强>
以上是对应该做什么的简单理解,但使用为此特定目的而制作的解决方案更好,名为 lookarounds :
/(?<!a)ab(?!b)/g
preg_match_all('/(?<!a)ab(?!b)/', $string, $matches);
答案 2 :(得分:0)
有几种方法。如上所述的正则表达式,或者使用简单的PHP代替:
$string = 'ab abc acd ab abd';
$chars = 'ab';
$strings = explode(" ", $string);
echo array_count_values($strings)[$chars];
// Outputs 2
// IF you don't have php 5.6:
$values = array_count_values($strings);
echo $values[$chars];
// Outputs 2