PHP preg_match (_all) для текстового диапазона - PullRequest
1 голос
/ 04 апреля 2019

пытается получить Textrange (n слов до и после) строку поиска (сам)

$text = 'Me, my dog and “myself“ are going on a vacation. Irene and myself are broke. Myself is here :P John and myself!';

 preg_match_all("/(?:[^ ]+ ){0,2}(?:[“'"(‘. ])myself(?:[“'")‘. ])(?: [^ ]+){0,2}/", $text, $matches);   

это дает мне совпадения:

* Собака и «я» едем

• я

Но это должно быть:

* Собака и «я» едем

• Ирина и я сломлены

• Джон и я!

Пожалуйста, помогите мне найти все совпадения в текстовом диапазоне 2 слова до и 2 слова после. не имеет значения, есть ли специальный символ или пробел до или после строки поиска (я) или «я» или «я» ...

thanks.Sepp

1 Ответ

1 голос
/ 04 апреля 2019

Проблема возникает из-за того, что [“'"(‘. ] и [“'")‘. ] являются обязательными и требуют наличия одного символа до и после 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!
)
...