Для того, что вы сказали в комментариях уже, вы не пытаетесь найти точное слово, так как слово имеет определенные границы. Итак, что вы пытаетесь сделать что-то вроде этого:
/(?:\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);
Затем вы хотите использовать регулярное выражение и использовать границы слов. – Rizier123
Он появляется в 'abc' тоже ... вы знаете – Farkie
Omg" ab abc acd ab abd "содержит" ab "3 раза, в чем проблема? –