【问题标题】:php/regex: How to replace part of a found pattern, but leaving the rest as it is?php/regex:如何替换找到的模式的一部分,但保留其余部分?
【发布时间】:2011-01-08 18:27:36
【问题描述】:

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

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

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

我想要

aaXaa aaX Xaa

成为

aaZaa aaZ Zaa

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

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

但是一个普通的 preg_match 替换了完整的匹配,我希望模式中除了“X”之外的任何东西都保持原样。

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

【问题讨论】:

  • 您的正则表达式与第二个单词末尾的 X 不匹配。
  • 我很困惑,一个简单的替换不完全符合您的要求吗?替换匹配的模式,其余的保持原样。
  • 抱歉冒昧了。我必须使用正则表达式,我的例子有点过于简单了!

标签: php regex


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢灵魂融合!正是我需要的!
  • 我发现在两个匹配组之间连接一个字符串变量时,我必须将数字放在大括号中,例如'${1}' . $foo . '${2}',否则它不起作用。这是为什么呢?
【解决方案2】:

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

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

【讨论】:

  • 我明白你的意思,实际情况当然更复杂。我将使用它来处理 xml 文档中的命名空间标签,因此必须有真正的正则表达式!
【解决方案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.

【讨论】:

  • 您需要在调用 preg_replace 之前对数组进行 ksort 排序,以便正确的模式被正确的值替换: ksort($patterns); ksort($replacements);
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    相关资源
    最近更新 更多