2

したがって、私のPHPコードには、そのような文字列があります。

The quick brown {{fox($a);}} jumped over the lazy {{dog($b);}}.

奇妙に聞こえるかもしれませんが、文字列を調べて、すべてのBBCodeスタイルのタグを収集したいと思います。

次に、 'seval()内にあるすべての関数を実行します。{{}}だから私は評価fox($a);dog($b);ます。

これらの関数は両方とも文字列を返します。そして、それぞれのタグをそれぞれの結果に置き換えたいと思います。したがってfox()、「vulpes vulpes」をdog()返し、「canis lupus」を返すとすると、元の文字列は次のようになります。

The quick brown vulpes vulpes jumped over the lazy canis lupus.

しかし、私は正規表現でひどいことで有名であり、これをどうやって行うのかわかりません。

どんなアドバイスでも大歓迎です!

(はい、幸運なことに幸運をもたらすことの危険性を認識していeval()ます。ただし、これらの文字列は厳密に開発者からのものであり、ユーザーは何も評価できません。)

4

2 に答える 2

3

正規表現を使用してこれを実行したい場合は、これが私にとってうまくいくように思われる解決策です:

function fox( $a) { return $a . 'fox!'; }
function dog( $b) { return $b . 'dog!'; }

$a = 'A'; $b = 'B';
$string = 'The quick brown {{fox($a);}} jumped over the lazy {{dog($b);}}.';
$regex  = '/{{([^}]+)+}}/e';
$result = preg_replace( $regex, '$1', $string);

正規表現は非常に単純です。

{{       // Match the opening two curly braces
([^}]+)+ // Match any character that is not a closing brace more than one time in a capturing group
}}       // Match the closing two curly braces

もちろん、/e修飾子によって置換がeval'dになり、次のようになります。

出力:

var_dump( $result);
// string(49) "The quick brown Afox! jumped over the lazy Bdog!."
于 2012-04-30T22:45:30.700 に答える
1

これらのタグに有効なphpを挿入するだけの場合は、次のことを実行できます。

$string = '.....';

$string = '?>' . $string;
$string = str_replace('{{', '<?php echo ', $string);
$string = str_replace('}}', '?>', $string);

ob_start();
eval($string);
$string = ob_get_clean();
于 2012-04-30T22:39:44.230 に答える