Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php preg_match:而不是表达式_Php_Regex_Preg Match - Fatal编程技术网

Php preg_match:而不是表达式

Php preg_match:而不是表达式,php,regex,preg-match,Php,Regex,Preg Match,我有一个带换行符的文本,我需要检查它是否有一些单词,但没有其他单词 例如: Lorem ipsum Door sit amet,为精英们献身,为埃乌斯莫德服务 暂时性的劳工和财产损失 如果文本中有单词“lorem”和“ipsum”,无论在哪一行,测试都应该失败。如果文本包含“lorem”,但在任何行上都没有“ipsum”,则应该成功 我可能会做一些变通,用条件、分解和strpos函数进行测试。但是我想使用正则表达式规则作为预定义的预设,因此我可以轻松地扩展功能。您可以使用如下正则表达式: lor

我有一个带换行符的文本,我需要检查它是否有一些单词,但没有其他单词

例如:

Lorem ipsum Door sit amet,为精英们献身,为埃乌斯莫德服务 暂时性的劳工和财产损失

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


我可能会做一些变通,用条件、分解和strpos函数进行测试。但是我想使用正则表达式规则作为预定义的预设,因此我可以轻松地扩展功能。

您可以使用如下正则表达式:

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

$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_匹配的情况下实现同样的效果,正如在他的评论中指出的:


此外,如果您想在不否定preg_匹配的情况下实现此功能,可以将其包装在一个零宽度负数组中,如:
^(?!lorem[\s\s]*ipsum | ipsum[\s\s]lorem.*$
。这将匹配两个单词都不存在的整个字符串(在删除其中一个单词之前显示为不匹配)

使用以下命令:

$str = "Lorem my string ipsum";
if (preg_match("/lorem/", $str) && !preg_match("/ipsum/", $str)) {
    //code here
}
创建两个不同的正则表达式模式比创建一个长正则表达式更容易

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

事实上,如果正则表达式有and运算符就好了,但至少我不知道这样的事情,所以您可以在正则表达式中将它们与or运算符匹配,然后使用数组_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";
}

我建议的正则表达式不需要
preg_match
匹配,并且只匹配一个多行字符串,在任何大写或小写中不包含“lorem”和“ipsum”,并且作为一个完整的单词:

(?si)
设置不区分大小写和单行模式,以便
可以匹配换行符并同时匹配“Lorem”和“Lorem”<代码>\bs仅用于匹配整个单词。它还将使具有
ipsum
的字符串失败(设置第二个条件
(?!.\bipsum\b.*$)
以处理该问题)


尝试了类似以下内容:
if(!preg_match(“/(lorem.*?ipsum | ipsum.*?lorem)/is“,$str)){/*code*/}
?单词边界和大小写敏感度如何?如果您对字符串匹配感到满意,那么我会选择
^(?si)(?!.\blorem\b.*\bipsum\b | \bipsum\b.*\blorem\b.*$).$
ipsum
存在而
lorem
不存在时。看。@WarGasm你似乎在评论几乎所有不起作用的事情,而不是唯一一个真正按照你的要求做的事情。那么你是说需要
lorem
?因为当我阅读你的问题时,我看到
如果它包含lorem,它不能包含ipsum
,而不是
它必须包含lorem,但不能包含ipsum
。对我来说,“如果文本有…”意味着它是可选的,而不是必需的。如果需要,那么这样一个简单的模式就可以工作:
/(?=.*lorem)(?!.*ipsum)。*/is
,这意味着
必须有lorem,不能有ipsum
。同时添加所有边界内容。它已经是多行的。你接受了一个与你的问题中要求的没有lorem的句子相匹配的答案,事实上,被接受的答案与“没有”和“绝对没有”相匹配,这真的很让人伤心(对你来说)。缺少delimeters。另外,如果只搜索一个单词,
stripos
会更好。这也不能解释没有lorem@JonathanKuhn-Oops的
ipsum
,对不起。我不熟悉PHP,只知道正则表达式。感谢您注意到关键在于,将任务分成两个不同正则表达式的调用通常比将所有工作塞进一个正则表达式更容易。此外,如果您想在不否定preg_匹配的情况下完成这项工作,可以将其封装在零宽度负组中,如:
^(?!lorem[\s\s]*ipsum | ipsum[\s\s]lorem.*$
。这将匹配两个单词都不存在的整个字符串。(在删除其中一个词之前,显示为不匹配)。几乎合适,谢谢回复。但是它需要“not”操作符进行preg_匹配。我怎么能离开呢?问题在另一个测试中。我有一系列规则,希望将此测试包括在一个周期的preg_比赛中。@JonathanKuhn非常有用,谢谢。刚刚添加到answer@WarGasm我已经和乔纳森更新了答案comments@WarGasm这不是你想要的吗?因为您在需求中没有提到这一点。SO要求“如果文本包含“lorem”,但任何一行都没有“ipsum”,那么它应该成功”。在没有lorem和ipsum的情况下尝试它,它也会匹配。这将返回true
dolor sit amet,concertetur adipising elit
根据您的要求,它应该是。如果您不需要它,请使用
^(?si)(?!.*\bipsum\b.$)(?!.\blorem\b.*\bipsum\b.\bipsum\b.*\blorem\b.$).$
-。已编辑2。@佩德罗洛比托是对的,但试着在你的演示中留下“lorem”,你就会得到匹配。这不是“非此即彼”的逻辑。这正是SO想要的匹配,其中
lorem
存在,而不是
ipsum
@stribizev,这太完美了!非常感谢。
^(?si)(?!.*?\bipsum\b.*$)(?!.*\blorem\b.*\bipsum\b|\bipsum\b.*\blorem\b.*$).*$
$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)) {
  ...
}