1

私はpreg_replace_callbackを使用しています。これが私がやろうとしていることです:

$result = '[code]some code here[/code]';

$result = preg_replace_callback('/\[code\](.*)\[\/code\]/is', function($matches){
      return '<div>'.trim($matches[1]).'</div>';
}, $result);

アイデアは、 [code]<div>[/code]</div>のすべての一致を に置き換え、それらの間のコードをトリミングすることです。

問題は、たとえば次の文字列にあります。

$result = '[code]some code[/code]some text[code]some code[/code]';

結果に2つの区切られたdivが必要です:

$result = '<div>some code</div>some text<div>some code</div>';

私が得る結果は次のとおりです。

$result = '<div>some code[code]some text[/code]some code</div>';

今、私はその理由を知っています. そして私は正規表現を理解していますが、私は解決策を思いつくことができませんでした. 誰かがそれを機能させる方法を知っていれば、私は非常に感謝します. 皆さんに感謝し、良い一日を.

4

2 に答える 2

3

あなたの問題は貪欲なマッチングです:

/\[code\](.*?)\[\/code\]/is

あなたが望むように振る舞うべきです。

Regex Repetition はgreedyです。つまり、可能な限り多くの一致するアイテムをキャプチャし、繰り返しの後に残ったものと一致しないことが判明した場合、一度に 1 つの一致を放棄します。クエスチョン マークを使用することで、非貪欲または遅延的に一致することを示します。これは、エンジンが正規表現の残りの部分を最初に一致させようとし、その後繰り返しのサイズを拡大しようとすることを意味します。

于 2013-10-18T19:02:42.257 に答える