2011-07-03 18 views
3

my $件名に適用する置換はほとんどありませんが、古い置換#(1 .. i-1)の出力を現在の置換と一致させたくありません#私。preg_replace複数のパターンを一度に置換する

$subject1 = preg_replace($pat0, $rep0, $subject0); 
$subject2 = preg_replace($pat1, $rep1, $subject1); 
$subject3 = preg_replace($pat2, $rep2, $subject2); 

私はそれが一度にそれを作ることを期待パターンとの交換のための配列で1 にpreg_replaceを使用してみました。私はおよそpreg_replace_callbackを読んだ後、それは

(もちろん、いくつかの最適化)を連続的にシンプルなにpreg_replaceを呼び出すよりもないことが判明し、私はそれが解決策ではないと思います。

助けが必要ですか?

答えて

3

コールバックを使用すると、キャプチャグループを使用して一致するパターンを検出できます((?:(patternt1)|(pattern2)|(etc)など)。一致するパターンをキャプチャするグループのみが定義されます。

唯一の問題は、現在のキャプチャグループが移動することです。名前付きグループを使用できる修正(回避策を読む)。 (ブランチは、ご使用のバージョンでサポートされている場合(?|(foo)|(bar)))は(動作しますが、その後、あなたには、いくつかの他の方法を使用してマッチしたパターンを検出する必要があると思いリセットされます。)

を例

function replace_callback($matches){ 
    if(isset($matches["m1"])){ 
     return "foo"; 
    } 
    if(isset($matches["m2"])){ 
     return "bar"; 
    } 
    if(isset($matches["m3"])){ 
     return "baz"; 
    } 
    return "something is wrong ;)"; 
} 

$re = "/(?|(?:regex1)(?<m1>)|(?:reg(\\s*)ex|2)(?<m2>)|(?:(back refs) work as intended \\1)(?<m3>))/"; 

$rep_string = preg_replace_callback($re, "replace_callback", $string); 

がテストされていません(ここにはPHPはありません)が、このようなものが動作する可能性があります。

+0

答えをありがとう。私は@ leonbloyの答えにちなんで名付けられたグループなしですでにそれをしました。しかし、あなたが名前付きグループを採用する方法を示したら、それは素晴らしいことでしょう。 – mmonem

+0

@mmonem、例を追加しました。 – Qtax

+0

ありがとうございます。これは私がやったよりも簡単です。 – mmonem

1

preg_replace_callbackは最も直接的な解決策です。 |演算子を使用して代替パターンを指定するだけで、コールバック内にifまたはswitchというコードがあります。私には正しい道が見えます。なぜあなたはそれを捨てましたか?

代替の解決方法は、一時的に特殊文字列を置き換えることです。言ってやるがいい。これは非常に醜いです

// first pass 
$subject = preg_replace($pat0, 'XXX_MYPATTERN0_ZZZ', $subject); 
$subject = preg_replace($pat1, 'XXX_MYPATTERN1_ZZZ', $subject); 
$subject = preg_replace($pat2, 'XXX_MYPATTERN2_ZZZ', $subject); 
// second pass 
$subject = preg_replace("XXX_MYPATTERN0_ZZZ",$rep0 , $subject); 
$subject = preg_replace("XXX_MYPATTERN1_ZZZ",$rep1 , $subject); 
$subject = preg_replace("XXX_MYPATTERN2_ZZZ",$rep2 , $subject); 

、動的な交換によく適応していない、それは誰にでもありませんが、いくつかのスクリプトを「一度実行」のために、それは許容かもしれません。

+0

お返事ありがとうございます。私はあなたのアイデアが好きなので今すぐあなたの最初のソリューションを勉強します – mmonem

+0

ありがとう、私はあなたのアイデアに従いましたが、彼はより多くの説明を与え完全な例を提供したので@ Qtaxの答えを受け入れました – mmonem

関連する問題