我需要匹配“ do you”之后的任意3个或更多字母单词,而不是“ lie”这个单词,但是当我尝试少于3个单词时,它不能正常工作。我该如何解决?
$text = "do you a";
if (preg_match("~(do you) (?!lie){3,}~", $text)) { echo "it matched!"; }
在不匹配时回显“匹配”。
答案 0 :(得分:4)
您的模式不正确。您不能将定量词应用于否定的前瞻性模式,而必须这样编写模式,
(do you) (?!lie\b)[a-zA-Z]{3,}
此外,您应该使用单词边界\b
使其不仅与lie
相匹配,还应使其与诸如lied
之类的其他单词相匹配
$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";
}
如果字符串并不总是包含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";
}