匹配一个3个或多个字母单词而不是某个单词的单词

时间:2019-05-03 08:04:04

标签: php regex preg-match

我需要匹配“ do you”之后的任意3个或更多字母单词,而不是“ lie”这个单词,但是当我尝试少于3个单词时,它不能正常工作。我该如何解决?

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

在不匹配时回显“匹配”。

2 个答案:

答案 0 :(得分:4)

您的模式不正确。您不能将定量词应用于否定的前瞻性模式,而必须这样编写模式,

(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

答案 1 :(得分:2)

非正则表达式的版本是将do you和空格处的句子展开,然后查看do you之后是什么单词,然后确保它是一个字符串,超过三个字符且不是“ lie”。

$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";
}