文本范围的PHP preg_匹配(_all)

文本范围的PHP preg_匹配(_all),php,regex,preg-match,Php,Regex,Preg Match,尝试获取一个搜索字符串(我自己)的Textrange(前后n个单词) 这给了我匹配: •狗和“我自己”要走了 •我自己 但它应该是: •狗和“我自己”要走了 •艾琳和我都破产了 •约翰和我 请帮助我查找所有匹配项,文本范围为前2个单词和后2个单词。 无论搜索字符串(我自己)或“我自己”或“我自己”之前或之后是否有特殊字符或空格 谢谢。Sepp问题的产生是因为[“”(“.]和[“””)都是强制性的,并且在我自己之前和之后都需要一个字符。然后,(?:[^]+){0,2}和(?:[^])还必须在我自己

尝试获取一个搜索字符串(我自己)的Textrange(前后n个单词)

这给了我匹配:

•狗和“我自己”要走了

•我自己

但它应该是:

•狗和“我自己”要走了

•艾琳和我都破产了

•约翰和我

请帮助我查找所有匹配项,文本范围为前2个单词和后2个单词。 无论搜索字符串(我自己)或“我自己”或“我自己”之前或之后是否有特殊字符或空格


谢谢。Sepp

问题的产生是因为
[“”(“.]
[“””)
都是强制性的,并且在
我自己
之前和之后都需要一个字符。然后,
(?:[^]+){0,2}
(?:[^])还必须在
我自己
之前和之后有另一个空格{0,2}

你可以用

'/(?:\S+\s+){0,2}(?:[“'"(‘.])?myself(?:[“'")‘.]?)(?:\s+\S+){0,2}/u'
或者允许使用
\p{p}
本人
周围使用任何标点符号:

'/(?:\S+\s+){0,2}\p{P}?myself\p{P}?(?:\s+\S+){0,2}/u'

请注意,
(?:[“”(“.])?
(?:[“”)”。]?)
(或
\p{p}?
)都是可选的,它们后面的
量词使正则表达式引擎只匹配这些模式的1或0次。因此,如果存在或不存在,则会发生匹配

:

输出:

Array
(
    [0] => dog and “myself“ are going
    [1] => Irene and myself are broke.
    [2] => John and myself!
)

你想在“我自己”之前加两个词,在“我自己”之后加两个词吗?是的。不管前后是否有特殊的字符或空格。它必须是正则表达式吗?是的,它必须是正则表达式,任何类型的正则表达式,或者只有preg_match?据我所知,这是正常的。非常感谢!sepp。
$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!
)