2011-08-06 9 views
2

PHPでpreg_split関数を使用して、いくつかの異なる要素を含む配列を1つ作成しています。しかし、私はpreg_splittingである要素の1つを含む文字列を除外したい。私がやりたい何PHPで文字列に分割可能文字が既に含まれている場合、preg_splitから文字列を除外する方法は?

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

は、ダッシュが含まれているため、このような分割のために一致しているから「FOO-バー」などの文字列を除外することです。 'foo-bar'は私の目的に完全に一致する必要があります。

+0

にあなたは、コードを使用する必要がありますブロック、この場合は空白を維持する – Veger

答えて

3

「foo-bar」のような例外が多い場合、結果として得られる正規表現は非常に複雑になります。私はここで何が起こっているのかを説明しましょう

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

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

結果:

あなたはその真パターンとしての条件として、後読みと先読みして、条件付きサブパターンを使用する必要があります。 \-手段

任意のダッシュ文字と一致します。

はなく、私たちが欲しいのは

マッチFOO-バーの一部ではない任意のダッシュ文字です。

それは我々がそれを少し変更であるとして、我々は正規表現でそれを実装することはできませんので:

マッチのfooが先行場合は、バーが続いていないことを任意のダッシュ文字。

我々は条件付きサブパターンを使用かの部分を実装するために、これは構文です:

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

私たちの「条件」とは、我々が後読みを使うことを確認するために、「FOOが先行」されるだろう:それが本当であれば

(?<=foo) 

我々は否定先読みを使用することを行うには、「バーが続かないダッシュ」を探してください:

\-(?!bar) 

これは私たちの「イエスパターン」になります。私たちの "パターンなし"は\-または "任意のダッシュ"にする必要があります。完全な正規表現は次のようになります。

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

UPDATE:最後に、あなたの現在の正規表現の変更には、この部分を、これを組み込む:

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

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

この例題がどのように元のpreg_sに組み入れられるかわからないプルト条件。私は今、私のサーバー上でいろいろな方法を試しています。希望の結果を生み出すサーバーを見つけることができません。応答していただきありがとうございます。 – Tony

+0

@Tonyは更新を参照してください。 – nobody

+0

@Tony最近の空白を検出する方法は非常に非効率的です: '/ \ s?(?:&amp;&gt | \/| \?| \:\:| \:| \ - )\ s?/ ' – nobody