3

PHP で単純な正規表現を使用してカスタム テンプレートを解析しています

$row = preg_replace_callback(
    '/\^([^\^]+)\^/', create_function ('$m', 'global $fields_ar; return $fields_ar{$m[1]};'),
    $template
    );

基本的に、2 つの ^ の間のすべては、対応する変数名の値に置き換えられます。たとえば、$template が次の場合:

 <td>^title_source^ by ^author_source^<br/>

$fields_ar['title_source'] == 'my title' and  $fields_ar['author_source'] == 'my author'

$行は次のようになります:

<td>my title by my author<br/>

すべて正常に動作しますが、区切り記号を変更したいです。他の 2 つの ^ の間に含まれるリスクがある ^ の代わりに、"sel3ction" などの文字列を使用したいのですが、

$row = preg_replace_callback(
    '/sel3ction([^sel3ction]+)sel3ction/', create_function ('$m', 'global $fields_ar; return $fields_ar{$m[1]};'),
    $template
    );

動作しません。問題は負の部分にあると確信しています。

助言がありますか?

私はそれが「クリーンな」アプローチではないことを知っています。最も奇妙な文字列でさえトリッキーになる可能性があるためですが、今のところ、この方法を試してみたいと思います。より標準的なソリューションがある場合は、もちろん大歓迎です。

ありがとう!

4

1 に答える 1

1

.遅延量指定子 ( ?)を使用してマッチングするときに、式が貪欲にならないように指示できます。

/sel3ction(.+?)sel3ction/

これにより、正規表現エンジンは、.(この場合は「sel3ction」) の後に続くものと、一致する可能性のある他のものと一致しないように指示されます。

于 2012-07-25T18:49:00.337 に答える