php / regex:如何替换已发现模式的一部分,但剩下的却是原样?

时间:2010-01-24 11:28:26

标签: php regex

如何替换找到的模式中的子字符串,但保留其余的字符串?

(编辑:真实情况当然比下面的例子更复杂,我必须匹配xml标签内的出现。这就是为什么我必须使用正则表达式!)

假设我想将单词中字母“X”的出现更改为字母“Z”。

我想要

  

aaXaa aaX Xaa

成为

  

aaZa aaZ Zaa

查找包含“x”的单词的出现不是问题,如下所示:

  

[^ X \ S] X [^ \ S]

但正常的preg_match取代了完整的匹配,我希望模式中的任何内容除了“X”以保持原样。

这是在php中实现这一目标的最好方法吗?

4 个答案:

答案 0 :(得分:14)

如果您的正则表达式仅匹配相关部分,则替换完整匹配(例如preg_replace('/X/', 'Z', $string))应该没有问题。

但是如果你需要正则表达式来包含不应该被替换的部分,你需要捕获它们并将它们插回:

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

答案 1 :(得分:2)

如果将X替换为Z非常简单,您也可以使用str_replace(),这比在这种情况下使用preg更快:

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

答案 2 :(得分:1)

试试这个

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

答案 3 :(得分:0)

你真的必须使用正则表达式吗?

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