2015-04-15 56 views
2

我有一個換行符的文本,我需要檢查它是否有一些詞,但沒有另一個詞。preg_match:非表達式

例如:

Lorem存有悲坐阿梅特,consectetur adipisicing ELIT,sed的做eiusmod tempor incididunt UT labore等dolore蚤aliqua。

如果文本中有單詞「lorem」和「ipsum」,則無論在哪一行中,測試都會失敗。如果文本包含「lorem」但在任何行上沒有「ipsum」,則它應該成功。

我可能會做一些變通方法,並與條件使測試,爆炸strpos功能。但我想使用正則表達式規則作爲預定義的預設,所以我可以輕鬆擴展功能。

+2

試過像'如果(的preg_match(! 「/(LOREM *存有|。?。?存有* LOREM)/是」 $ STR)){/ *代碼*/}'? – AlphaDelta

+0

字面界限如何區分大小寫?我會用'^(?si)(?!。* \ blorem \ b。* \ bipsum \ b | \ bipsum \ b。* \ blorem \ b。* $)。* $'如果您滿意'ipsum'存在且lorem不存在時,字符串匹配。請參閱https://regex101.com/r/lB5qX5/1。 –

+1

@WarGasm你似乎在評論幾乎所有不起作用的東西,而不僅僅是那些正在做你所問的東西。 GL。 –

回答

0

我建議正則表達式不需要!preg_match,在任何大寫或小寫和整個單詞只有一個多字符串匹配無倆「排版」和「文字」:

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

(?si)設置不區分大小寫和單行模式,以便.可以匹配換行符並匹配「Lorem」和「lorem」。 \b s僅用於匹配整個單詞。它也會失敗一個字符串,它具有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)) { 
    ... 
} 
+0

幾乎完成了,但只給_ipsum_賦予了正確的結果。 – WarGasm

+0

SO問「如果文本包含」lorem「,但沒有任何行上的」ipsum「,那麼它應該成功」。嘗試它沒有lorem和ipsum,它也匹配。這返回true'多樂士坐amet,consectetur adipisicing elit' –

+1

根據您的要求,它應該。如果你不想要它,可以使用'^(?si)(?!。*?\ bipsum \ b。* $)(?!。* \ blorem \ b。* \ bipsum \ b | \ bipsum \ b。* \ blorem \ b。* $)。* $' - https://regex101.com/r/lB5qX5/4。編輯2. –

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

另外,如果你想使這個工作,而不需要否定的preg_match,你可以將它包裝在一個零寬度負團,如:'^(?!LOREM [\ S \ S] *存有|存有[\ S \ S ]排版測試)。* $'。這將匹配兩個詞不存在的整個字符串。 [演示](https://regex101.com/r/uN2jN6/2)(顯示爲不匹配,直到您刪除其中一個單詞)。 –

+0

幾乎適合,謝謝你的回覆。但是preg_match需要「不」運算符。我怎麼能離開它?問題在於另一個測試。我有一系列規則,並希望將此測試包括在preg_match的一個循環中。 – WarGasm

+0

@JonathanKuhn非常有用,謝謝。剛剛添加到答案 –

1

使用此:

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

這是比較容易做2個不同的正則表達式模式,除有一個長的正則表達式

+0

缺少定界符。另外,如果你只搜索一個單詞,'stripos'會更好。這也不包含沒有'lorem'的'ipsum'。 –

+0

@JonathanKuhn哎呀,對不起。我對PHP不熟悉,只知道正則表達式。感謝您的注意 – Victor2748

+1

關鍵是,將任務分解爲兩個不同正則表達式的調用通常比較容易,而不是試圖將所有工作都塞進一個正則表達式中。 –

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

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