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

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

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

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

я хочу

aaXaa aaX Xaa

становиться

aaZaa aaZ Zaa

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

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

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

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

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

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

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

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

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

Попробуй это

 <?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. 

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

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