6

正規表現が1つあり、一致の配列内の各一致を、可能な限り最も効率的な方法で対応する置換の配列に置き換えたいと考えています。

たとえば、私は次のようにしています。

$string = '~~hello~~ there, how ~~are~~ ~~you~~?';

$pattern = '/~~(.*?)~~/';

$replacements = array();
$replacements[0] = 'hi';
$replacements[1] = 'am';
$replacements[2] = 'i';

そして私はになりたい$string

hi there, how am i?

当初、私はそれが次のように単純であることを望みました:

$string = preg_replace($pattern, $replacements, $string);

しかし、それは機能していないようです。したがって、最初の質問は次のとおりです。$replacementsが配列の場合、それ$stringも配列でなければなりませんか?

これで、一致の数を数えたり、適切な数の同一の正規表現で配列を作成したりするなど、これを行うための(一見)非効率的な方法を思い付くことができます。しかし、これは私たちを質問2に導きます:より効率的な方法はありますか?PHPのプロ、どうしますか?

4

3 に答える 3

3

ここで簡単な評価トリックを使用できます:

print preg_replace('/~~(\w+)~~/e', 'array_shift($replacements)', $st);

array_shift置換配列から最初のエントリをフェッチするだけです。

ただし、マップを使用する方がよいでしょう("hello" => "hi")。

于 2012-11-17T03:24:32.190 に答える
1

私は使うかもしれませんpreg_replace_callback

$string = '~~hello~~ there, how ~~are~~ ~~you~~?';

$pattern = '/~~(.*?)~~/'; 

var_dump(preg_replace_callback($pattern, 
    function($matches) { 
        static $replacements = array('hi', 'am', 'i'), $i = 0; 
        return $replacements[$i++ % count($replacements)]; 
    }, 
    $string));

出力:

string(19) "hi there, how am i?"
于 2012-11-17T03:38:19.117 に答える
1

これらの3つの特定のフレーズを別の特定のフレーズのセットに切り替えるだけの場合str_replaceは、よりもはるかに高速であるため、そのまま使用できますpreg_replace

$subject = "~~hello~~ there, how ~~are~~ ~~you~~?";
$matches = array('~~hello~~', '~~are~~', '~~you~~');
$replace = array('hi', 'am', 'i');

str_replace($matches, $replace, $subject);
于 2012-11-17T05:59:09.620 に答える