我有一个带换行符的文字,我需要检查它是否有一些单词,但没有另一个单词。
例如:
Lorem ipsum dolor sit amet,consectetur adipisicing elit,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua。
如果文本中包含单词“lorem”和“ipsum”,则无论在哪一行,测试都应该失败。如果文本包含“lorem”但在任何行上没有“ipsum”,那么它应该会成功。
我可能会做一些解决方法,并使用条件进行测试,爆炸和 strpos 函数。但我想将正则表达式规则用作预定义的预设,因此我可以轻松扩展功能。
答案 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
}
}
答案 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)) {
...
}