2

いくつかの異なる要素を含む1つの配列を作成するために、PHPでpreg_split関数を使用しています。ただし、preg_splittingしている要素の1つをたまたま含む文字列を除外したいと思います。

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

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

4

2 に答える 2

3

'foo-bar'のような多くの例外がある場合、結果の正規表現は特に非常に複雑になります。

条件として後読み、yesパターンとして先読みを持つ条件付きサブパターンを使用する必要があります。

$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-barの一部ではないダッシュ文字に一致します。

そのまま正規表現で実装することはできないので、少し変更します。

fooが前にある場合にbarが続かないダッシュ文字に一致します。

条件付きサブパターンを使用するif部分を実装するには、次の構文を使用します。

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

「条件」は「fooが先行」して、後読みを使用していることを確認します。

(?<=foo)

それが本当なら、「バーが続かないダッシュ」を探して、ネガティブな先読みを使用する必要があります。

\-(?!bar)

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

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

更新:これを現在の正規表現に組み込むには、最後にこの部分を変更します。

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

|\s?(?(?<=foo)\-(?!bar)|\-)\s?/
于 2011-08-06T15:59:15.760 に答える
0

この場合、私のソリューションが誰の二重ルックアラウンドパターンよりも効率的であることを保証するものではありませんが、私のソリューションは少し読みやすいと思います。(*SKIP)(*FAIL)無視したい部分文字列を効果的に照合して破棄します。場合によっては、このアプローチは非常に有用/効果的/保守可能です。

コード:(デモ

$string = 'I-like-candy-and-foo-bar-sandwiches';
var_export(preg_split('~foo-bar(*SKIP)(*FAIL)|-~', $string));

出力:

array (
  0 => 'I',
  1 => 'like',
  2 => 'candy',
  3 => 'and',
  4 => 'foo-bar',
  5 => 'sandwiches',
)

完全に正直に言うと、誰の答えも少し過剰に設計されているとは思いません。否定された後読みおよび否定された先読みとしてより簡単に書くことができます...条件付き構文の理由はありません。

コード:(デモ

$string = 'I-like-candy-and-foo-bar-sandwiches';
var_export(preg_split('~(?<!foo)-(?!bar)~', $string));

出力:

array (
  0 => 'I',
  1 => 'like',
  2 => 'candy',
  3 => 'and',
  4 => 'foo-bar',
  5 => 'sandwiches',
)

ps入力文字列の先頭または末尾にハイフンがあり、によって空の要素が生成されないようにする場合、関数呼び出しで(それぞれ)パラメーター3および4としてandをpreg_split()使用します。0PREG_SPLIT_NO_EMPTY

于 2018-08-02T07:24:34.810 に答える