Проблема возникает из-за того, что [“'"(‘. ]
и [“'")‘. ]
являются обязательными и требуют наличия одного символа до и после myself
.Кроме того, должен быть еще один пробел до и после myself
, требуемый для (?:[^ ]+ ){0,2}
и (?: [^ ]+){0,2}
.
. Вы можете использовать
'/(?:\S+\s+){0,2}(?:[“'"(‘.])?myself(?:[“'")‘.]?)(?:\s+\S+){0,2}/u'
или разрешить любую пунктуацию вокруг myself
с \p{P}
:
'/(?:\S+\s+){0,2}\p{P}?myself\p{P}?(?:\s+\S+){0,2}/u'
См. regex demo
Обратите внимание, что (?:[“'"(‘.])?
и (?:[“'")‘.]?)
(или \p{P}?
) являются необязательными,Квантификатор ?
после них заставляет механизм регулярных выражений совпадать только с 1 или 0 экземплярами этих шаблонов.Итак, если оно есть или нет, совпадение происходит.
Демонстрация PHP :
$text = 'Me, my dog and “myself“ are going on a vacation. Irene and myself are broke. Myself is here :P John and myself!';
if (preg_match_all('/(?:\S+\s+){0,2}\p{P}?myself\p{P}?(?:\s+\S+){0,2}/u', $text, $result)) {
print_r($result[0]);
}
Вывод:
Array
(
[0] => dog and “myself“ are going
[1] => Irene and myself are broke.
[2] => John and myself!
)