Как заменить две подстроки на preg_replace? - PullRequest
0 голосов
/ 25 октября 2018

Я хочу заменить две подстроки друг на друга, так как

$str = 'WORD1 some text WORD2 and we have WORD1.';

$result = 'WORD2 some text WORD1 and we have WORD2.';

Я использую preg_replace, чтобы соответствовать заменяющим словам,

$result = preg_replace('/\bWORD1(?=[\W.])/i', 'WORD2', $str);

, но как я могу изменить WORD2 до WORD1 (в оригинале $str)?

Проблема заключается в том, что замену следует выполнять одновременно.В противном случае word1, измененное на word2, будет снова изменено на word1.

Как я могу сделать замены одновременно?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Так же, как и другим способом.

Вы можете заменить шаг за шагом, если вы используете промежуточный символ.Я также предпочитаю preg_replace_callback (), просто чтобы показать, что я имею в виду:

$str = 'WORD1 some text WORD2 and we have WORD1.';

$w1 = "WORD1";
$w2 = "WORD2";

$interChr = chr(0);
$str = str_replace($w1, $interChr, $str);
$str = str_replace($w2, $w1, $str);
$str = str_replace($interChr, $w2, $str);

echo $str;
// WORD2 some text WORD1 and we have WORD2.
0 голосов
/ 25 октября 2018

Вы можете использовать preg_replace_callback:

$str = 'WORD1 some text WORD2 and we have WORD1.';
echo preg_replace_callback('~\b(?:WORD1|WORD2)\b~', function ($m) {
    return $m[0] === "WORD1" ? "WORD2" : "WORD1";
}, $str);

См. Демоверсию PHP .

Если WORD s - строки Unicode, также добавьте uмодификатор '~\b(?:WORD1|WORD2)\b~u'.

Шаблон \b(?:WORD1|WORD2)\b соответствует либо WORD1, либо WORD2 как целым словам, а затем внутри анонимной функции, используемой в качестве аргумента замены, вы можете проверить значение соответствия иприменять собственную логику замены для каждого случая.

...