preg_match:和 - 不是表达式

时间:2015-04-15 22:18:17

标签: php regex preg-match

我有一个带换行符的文字,我需要检查它是否有一些单词,但没有另一个单词。

例如:

  

Lorem ipsum dolor sit amet,consectetur adipisicing elit,sed do eiusmod   tempor incididunt ut labore et dolore magna aliqua。

如果文本中包含单词“lorem”和“ipsum”,则无论在哪一行,测试都应该失败。如果文本包含“lorem”但在任何行上没有“ipsum”,那么它应该会成功。

我可能会做一些解决方法,并使用条件进行测试,爆炸 strpos 函数。但我想将正则表达式规则用作预定义的预设,因此我可以轻松扩展功能。

5 个答案:

答案 0 :(得分:1)

你可以使用这样的正则表达式:

lorem[\s\S]*ipsum|ipsum[\s\S]lorem

<强> working demo

$re = "/lorem[\\s\\S]*ipsum|ipsum[\\s\\S]lorem/i"; 
$str = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."; 

if (!preg_match($re, $str, $matches)) {
     // your code here
}

更新你可以在不否定preg_match的情况下实现同样的效果,因为 Jonathan Kuhn 在他的评论中指出:

  

此外,如果你想在不需要否定preg_match的情况下完成这项工作,你可以将它包装在零宽度负片组中,如:^(?!lorem[\s\S]*ipsum|ipsum[\s\S]lorem).*$。这将匹配两个单词不存在的整个字符串。 Demo (在您删除其中一个字词之前显示为不匹配)。

答案 1 :(得分:1)

使用此:

$str = "Lorem my string ipsum";
if (preg_match("/lorem/", $str) && !preg_match("/ipsum/", $str)) {
    //code here
}

制作2个不同的正则表达式模式比使用单个长正则表达式

更容易

答案 2 :(得分:0)

$string ="Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore ipsum et dolore magna aliqua.";

$string2 ="Lorem dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";

loremIpsum  ($string );
//string contrains lorem and ipsum
loremIpsum  ($string2 );
//string only contrain lorem

function loremIpsum  ($string){
    if (!preg_match('/(lorem.*?ipsum|ipsum.*?lorem)/sim', $string)) {

        if (preg_match('/lorem/sim', $string )) {
            # Successful match
            echo "string only contain lorem"; // TRUE
        }else{
            echo "string doesn't contain lorem"; //FALSE
        }

    }else{
        echo "string contrains lorem and ipsum"; //FALSE
    }
}

DEMO

答案 3 :(得分:0)

实际上,如果正则表达式有一个和运算符,但至少我不知道这样的事情会很好,所以你可以在正则表达式中使用或运算符匹配它们,然后使用array_intersect进行检查。

$checkArray = array ('lorem', 'ipsum');
$haystack = "lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";

$matched = preg_match_all("/lorem|ipsum/i", $haystack, $result, PREG_PATTERN_ORDER);

if ($matched && count($checkArray) == count(array_intersect($checkArray,$result[0]))) {
    echo "Gotcha";
}

答案 4 :(得分:0)

我建议的正则表达式不需要!preg_match,并且只匹配多行字符串而不包含任何大写或小写的“lorem”和“ipsum”以及整个单词< / EM>:

^(?si)(?!.*?\bipsum\b.*$)(?!.*\blorem\b.*\bipsum\b|\bipsum\b.*\blorem\b.*$).*$

(?si)设置不区分大小写和单行模式,以便.可以匹配换行符并匹配“Lorem”和“lorem”。 \b仅用于匹配整个单词。它也会失败一个ipsum的字符串(设置第二个条件(?!.*?\bipsum\b.*$)来处理)。

请参阅demo here

$re = "/^(?si)(?!.*?\\bipsum\\b.*$)(?!.*\\blorem\\b.*\\bipsum\\b|\\bipsum\\b.*\\blorem\\b.*$).*$/"; 
$str = "dolor lorem sit amet, consectetur adipisicing elit, \nsed do eiusmod tempor incididunt ut labore et dolore magna aliqua."; 
if (preg_match($re, $str, $matches)) {
  ...
}