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);