Подберите слово, состоящее из 3 или более букв, которые не являются определенным словом - PullRequest
0 голосов
/ 03 мая 2019

Мне нужно сопоставить любые 3 или более буквенных слов после слова «ты», это не слово «ложь», но когда я попробовал это, когда меньше 3 слов, это не работает должным образом. Как мне это исправить?

$text = "do you a";
if (preg_match("~(do you) (?!lie){3,}~", $text)) { echo "it matched!"; }

Это повторило "это совпало", когда не должно совпадать.

Ответы [ 2 ]

5 голосов
/ 03 мая 2019

Ваш шаблон неверен.Вы не можете применить квантификатор к шаблону с отрицательным прогнозом и должны написать свой шаблон следующим образом:

(do you) (?!lie\b)[a-zA-Z]{3,}

Кроме того, вы должны использовать границу слова \b, чтобы она не соответствовала просто lie, нооно соответствует другим словам, таким как lied

Regex Demo

PHP Code demo

$text = "do you a";
if (preg_match("~(do you) (?!lie\b)[a-zA-Z]{3,}~", $text)) { echo "it matched! ".$text; }
$text = "do you lie";
if (preg_match("~(do you) (?!lie\b)[a-zA-Z]{3,}~", $text)) { echo "it matched! ".$text; }
$text = "do you lied";
if (preg_match("~(do you) (?!lie\b)[a-zA-Z]{3,}~", $text)) { echo "it matched! ".$text; }

Печатает только это,

it matched! do you lied
2 голосов
/ 03 мая 2019

Версия без регулярных выражений состоит в том, чтобы разбить предложение на do you и в пробеле и посмотреть, что за словом стоит после do you, а затем убедиться, что это строка длиной более трех символов и не "ложь".

$text = "John do you know a lie";
$after = explode(" ", explode("do you ", $text)[1])[0];
echo $after;

if(strlen($after) >=3 && is_string($after) && strtolower($after) != "lie"){
    echo "true";
}else{
    echo "false";
}

https://3v4l.org/tJ754

Если строка не всегда содержит do you, вам нужно проверить массив после первого разнесения, если у него есть второй элемент.
В противном случае он вернетсяуведомление, неопределенное [1].

$text = "John do know a lie";
$temp = explode("do you ", $text);

if(isset($temp[1])){
    $after = explode(" ", $temp[1])[0];
}else{
    $after = null;
}
echo $after;

if(strlen($after) >=3 && is_string($after) && strtolower($after) != "lie"){
    echo "true";
}else{
    echo "false";
}
...