0
$value = "abrak'adabra' baba";

$pattern = array();
$replacement = array();

$pattern[] = '/(\'[^\']+\')|(a)/e';
$replacement = "strlen('\\2') ? 'i' : '\\0'";

上記のコードはabrak'adabra' babaibrik'adabra' bibiに変更します

私がやりたいことは、abrak'adabra' babaabrak'idibri' baba に変更することです。どうやってするか?

正直なところ、私は上記の正規表現パターンを本当に理解していません。私が知っていることとコードについて知らないことがあります:

  • $pattern で次のように言います: (2 つの引用符があり、その間に引用符がない) または (文字 "a") 代わりに、/e 修飾子が使用されるため、strlen などの php コードが機能します。しかし、なぜ「または」の論理なのか理解できません。
  • パターンの 2 番目の部分 (a 文字) の長さが 0 より大きい場合は、それを「i」に置き換えるか、別のことを行います (\0 の意味がわかりません)

どんな助けにも感謝します。この正規表現は私をイライラさせます:(

4

1 に答える 1

0

e誰かがサーバー上で悪意のあるコードを実行する可能性があるため、修飾子 (eval) をパターンで使用することは危険です (詳細については、マニュアルのセクションを参照してください)。

代わりに、一致したアイテムに対して追加の処理を行う必要がある場合は、次を使用できますpreg_replace_callback

// Find all characters between single quotes
$result = preg_replace_callback('/\'(.*?)\'/', function($matches){
    // Replace 'a' with 'i' in found matches
    return '\''.str_replace('a', 'i', $matches[1]).'\'';
}, $value);

a引用符の間を置き換えるだけの場合はi、より最適な方法があるかもしれませんが、この方法では、引用符の間にある文字列をより高度に処理する余地があります。

于 2012-11-22T00:23:35.620 に答える