2

PHPには、いくつかの文字列タグ(擬似コード)があります。

[TAG_A]              = X
[TAG_B]              = Y
[TAG_X]              = Z

したがって、これらのタグを文字列に置き換えると、次のようになります。

[TAG_A] and [TAG_B] are connected with [TAG_[TAG_A]]

次のように出力されます。

X and Y are connected with Z

問題はネストされたタグにあります。再帰的である必要があり、最初に内部タグが置き換えられます。可能なすべてのタグ(およびそれらの値)は、大きな配列に格納されます。

総当たり攻撃を使用foreachしてtags-arrayを使用してすべてのタグを置き換えるだけでなく、実際[]には文字列内の-pairsのみを検索し、tags-array内の値を検索するreplaceメソッドが必要です。

正規表現は正しい方法ではないと思いますが、このようなことを行うための最も効率的な方法は何ですか?

4

1 に答える 1

1

文字列内のタグを置き換え、プロセス後に新しいタグが表示されるかどうかを確認します。置き換えるタグがなくなるまで、コードを再実行します。

$string = '[TAG_A] and [TAG_B] are connected with [TAG_[TAG_A]]';
$search = array(
    '[TAG_A]'   => 'X',
    '[TAG_B]'   => 'Y',
    '[TAG_X]'   => 'Z'
);
$continue = true;
while ($continue) {
    foreach ($search as $find => $replace) {
        $string = str_replace($find, $replace, $string);
    }
    $continue = false;
    foreach ($search as $find => $replace) {
        if (strpos($string, $find) !== false) {
            $continue = true;
            break;
        }
    }
}
echo $string; // prints "X and Y are connected with Z"

正規表現ソリューション:

$string = '[TAG_A] and [TAG_B] are connected with [TAG_[TAG_A]]';
$search = array(
    'TAG_A' => 'X',
    'TAG_B' => 'Y',
    'TAG_X' => 'Z'
);
while(preg_match_all('/\[([^\[\]]*?)\]/e', $string, $matches)) {
    $string = preg_replace('/\[([^\[\]]*?)\]/e', '$search["$1"]', $string);
}
echo $string;
于 2013-02-04T15:41:12.000 に答える