Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php/regex:如何替换找到的模式的一部分,但保留其余部分不变?_Php_Regex - Fatal编程技术网

php/regex:如何替换找到的模式的一部分,但保留其余部分不变?

php/regex:如何替换找到的模式的一部分,但保留其余部分不变?,php,regex,Php,Regex,如何替换已找到模式中的子字符串,但保持其余的不变 (编辑:实际情况当然比下面的示例更复杂,我必须匹配xml标记中出现的情况。这就是为什么我必须使用正则表达式!) 假设我想将单词中出现的字母“X”改为字母“Z” 我想要 aaXaa aaX Xaa 成为 aaZaa aaZ Zaa 查找包括“x”在内的单词的出现并不成问题,如下所示: [^X\s]X[^\s] 但是一个普通的preg_匹配会取代完整的匹配,在这里我希望模式中除了“X”之外的任何东西都保持原样 在php中实现这一点的最佳方法是什么?如

如何替换已找到模式中的子字符串,但保持其余的不变

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

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

我想要

aaXaa aaX Xaa

成为

aaZaa aaZ Zaa

查找包括“x”在内的单词的出现并不成问题,如下所示:

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

但是一个普通的preg_匹配会取代完整的匹配,在这里我希望模式中除了“X”之外的任何东西都保持原样


在php中实现这一点的最佳方法是什么?

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

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

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

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

如果它真的像用
Z
替换
X
一样简单,那么您也可以使用
str_replace()
,在这种情况下比使用
preg
更快:

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

你真的要用正则表达式来做这个吗

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

您的正则表达式与第二个单词末尾的X不匹配。我很困惑,一个简单的替换不正是您所要求的吗?替换匹配的图案,其余的保持原样。很抱歉出现混乱。我必须使用regex,我的例子有点过于简化了!谢谢你,索尔梅奇!正是我需要的!我发现,在两个匹配组之间连接字符串变量时,我必须将数字放在花括号中,如
“${1}”$福。”${2} “
,否则它不起作用。为什么?我明白你的意思,而实际情况当然更复杂。我将使用它来处理xml文档中的名称空间标记,因此必须有真正的正则表达式!在调用preg_replace之前,需要对数组进行k排序,以便用正确的值替换正确的模式:k排序($patterns);ksort(替换);
$output = str_replace('X', 'Z', $input);