Php/regex: как заменить часть найденного шаблона, но оставить остальное как есть?

Как заменить подстроку в найденном шаблоне, но оставив все как есть?

(EDIT: реальный случай, конечно, сложнее, чем приведенный ниже пример, мне нужно сопоставлять события в тегах xml. Поэтому я должен использовать регулярное выражение!)

Скажем, я хочу изменить происхождение буквы "X" внутри слова на букву "Z".

Я хочу

aaXaa aaX Xaa

чтобы стать

aaZaa aaZ Zaa

Поиск совпадений слов, включая "x", не является проблемой, например:

[^ Х \s] X [^\s]

но обычный preg_match заменяет полное совпадение, где мне нужно что-либо в шаблоне, кроме "X", чтобы оставаться таким, как есть.

Какой лучший способ выполнить это в php?

Ответ 1

Если ваше регулярное выражение соответствует только соответствующей части, не должно быть проблем, что он заменяет полное соответствие (например, preg_replace('/X/', 'Z', $string)).

Но если вам нужно, чтобы регулярное выражение содержало части, которые не нужно заменять, вам нужно их захватить и вставить обратно:

preg_replace('/(non-replace)X(restofregex)/', '$1Z$2', $string);

Ответ 2

Если это так просто, как заменить X на Z, вы также можете использовать str_replace(), который быстрее, чем использование preg в этом случае:

$sNew = str_replace("X", "Z", $sOld);

Ответ 3

Попробуйте это

<?php
$string = 'The quick brown fox jumped over the lazy dog.';
$patterns[0] = '/quick/';
$patterns[1] = '/brown/';
$patterns[2] = '/fox/';
$replacements[2] = 'bear';
$replacements[1] = 'black';
$replacements[0] = 'slow';
echo preg_replace($patterns, $replacements, $string);
?>

Вышеприведенный пример выводит:

The bear black slow jumped over the lazy dog.

Ответ 4

Вам действительно нужно использовать regex для этого?

$output = str_replace('X', 'Z', $input);