2011-08-06 31 views
2

我正在使用PHP的使preg_split功能,以創建包含幾個不同元件的一個陣列。但是,我想排除恰好包含我由preg_splitting的元素之一的字符串。如何從使preg_split排除字符串時,字符串已經包含在PHP中裂開的性格嗎?

$array['stuff'] = preg_split('/\[#]|\ &amp |\ &amp |\&amp |\&amp|\ &amp|\ &gt |\ &gt |\&gt |\&gt|\ &gt|\ & |\ & |\& |\&|\ &|\ \/ |\ \/ |\\/ |\\/|\ \/|\ > |\ > |\> |\>|\ >|\ , |\ , |\, |\,|\, |\ :: |\ :: |\:: |\ ::|\::|\ ::|\ : |\ : |\: |\:|\ :|\ - |\ - |\- |\-|\ -/', $array['stuff']) ; 

我想這樣做是爲了排除一個字符串,如從,因爲它包含一個破折號被匹配的一瞬間「富酒吧」。 'foo-bar'需要與我的目的完全匹配。

+0

您應該使用的代碼塊,在這種情況下,它保留空格 – Veger

回答

3

產生的正則表達式將專門是非常複雜的,如果你有很多例外,如「富吧」。

你應該使用條件子模式與回顧後作爲條件,在先行其是模式:

$res = preg_split('/(?(?<=foo)\-(?!bar)|\-)/', 'aasdf-fafsdf-foo-bar-asdf'); 
var_dump($res); 

結果:

array(4) { 
    [0]=> 
    string(5) "aasdf" 
    [1]=> 
    string(6) "fafsdf" 
    [2]=> 
    string(7) "foo-bar" 
    [3]=> 
    string(4) "asdf" 
} 

讓我解釋這裏發生了什麼。 \-表示

匹配任何破折號字符。

,但我們需要的是

匹配任何連字符不是FOO酒吧的一部分。

由於我們無法實現,在正則表達式,因爲它是我們改變了一點:

匹配任何破折號字符如果由富先不跟吧。

要實現我們使用條件子模式的如果的一部分,這是語法:

(?(condition)yes-pattern|no-pattern) 

我們的「條件」將被「前面加富」來檢查,我們使用一個回顧後:

(?<=foo) 

如果這是真的,我們應該尋找做到這一點,我們使用負先行「即不跟吧破折號」:

\-(?!bar) 

,就變成了我們的「是的模式」。我們的「無模式」應該是\-或「任何破折號」。完整的正則表達式是:

(?(?<=foo)\-(?!bar)|\-) 

UPDATE:年底合併到您當前的正則表達式改變這個這個部分:

|\ - |\ - |\- |\-|\ -/ 

|\s?(?(?<=foo)\-(?!bar)|\-)\s?/ 
+0

我不知道這個特定的例子將如何納入原始preg_s分裂條件。我正在嘗試各種方式在我的服務器上,而我找不到能產生所需結果的方法。感謝您的迴應。 – Tony

+0

@Tony查看更新。 – nobody

+0

@Tony順便說一句,你現在檢測空白的方式效率很低,就像這樣:'/ \ s?(?:&amp;&gt | \/| \?| \:\:| \:| \ - s?/' – nobody

相關問題