2016-06-21 80 views
0

我有這個文本,我想搜索單詞「工作」,除了短語「在職培訓」或短語列表。 如果我用這個的preg_match http://regexr.com/3dlo7如何排除短語preg_match

我得到3個結果...但我想只有第1和第3

這是一個很好的工作,這是對在職培訓。幹得好

preg_match的任何想法?

+0

使用斷言http://php.net/manual/en/regexp嘗試.reference.assertions.php'(?<!)\ bjob​​ \ b(?!訓練)' – Danijel

回答

3

首先,當你要測試PHP正則表達式,不要使用被設計爲Javascript RegExr,您可以改用regex101.comregex.larsolavtorvik.com

你可以設計你的模式是這樣的:

\bjob\b(?!(?<=\bon the job) training\b) 

,如果你想排除其他情況:

\bjob\b(?!(?<=\bon the job) training\b|(?<=\bthe job) I hate\b) 

你也可以使用一個(*SKIP)(*F)模式(這使得子模式失敗並且強制已經匹配的字符被跳過),它可以更容易編寫但效率較低(由於模式在開始時具有交替的事實)

\b(?:on the job training\b(*SKIP)(*F)|the job I hate\b(*SKIP)(*F)|job\b) 

您使用第一個字符識別技巧可以改善它一點對不感興趣的職位很快會失敗:

\b(?=[otj])(?:on the job training\b(*SKIP)(*F)|the job I hate\b(*SKIP)(*F)|job\b) 
+0

比我的完整得多,+1。 – Toto

1

如何使用lookaround

$str = 'This is a good job and this is on the job training. Nice job'; 
preg_match_all('/(?<!on the)\bjob\b(?! training)/', $str, $m); 
print_r($m); 

輸出:

Array 
(
    [0] => Array 
     (
      [0] => job 
      [1] => job 
     ) 

) 
+0

我將有一個排除短語列表..這只是一個。 – Michalis

+1

@Michalis:你的問題沒有說,請編輯它來添加一些示例輸入字符串和預期結果。 – Toto

+0

寫這個,它會排除「之前」的所有單詞「工作」,而不是跟隨「訓練」,所有單詞「工作」之前沒有「上」,跟着「訓練」。 –

0

使用這個表達式: -

\bjob(?!\straining)\b 

http://regexr.com/3dloj

您的評論後,你也希望你的字前,以排除字下面,然後用正則表達式: -

\b(?<!Nice\s)job(?!\straining)\b // exclude Nice word 

http://www.phpliveregex.com/p/g8h

(?<!Nice\s)job比賽Nice"job"不是由一個"Nice "之前,使用負回顧後。

+0

差不多....我可以添加|我的單詞之後有單詞,但我不能在我的單詞之前添加排除單詞 – Michalis

+0

如果您不理會尼斯單詞,請使用以下正則表達式: - ** \ b(?<!Nice \ s)作業(?!\ straining)\ b ** –