【问题标题】:PHP replace substring of varying lengthPHP替换不同长度的子字符串
【发布时间】:2014-04-16 04:31:01
【问题描述】:

我正在寻找用不同长度的新值替换子字符串。我对 substr_replace 有一个模糊的了解,但如果替换字符串比原始字符串短,它会留下额外的字符。

我需要编辑的基本字符串如下所示

In Target(+-50%): <span style="color: red">33%</span>(1/3)<br>

我需要在 span 标签的结束 > 之后和 br 标签的开始

例如:我要删除的字符串是“33%(1/3)”,即 7 个​​字符。我想用 16 个字符的“9%(9/100)”替换它。我不想覆盖 br 标签。

这看起来应该很简单,但我无法理解它。我应该查看 preg_replace 吗?

【问题讨论】:

  • 你需要正则表达式来做到这一点......
  • @HenriqueBarcelos 现在你有两个问题。开个玩笑:)
  • 您的目标字符串实际上是33%(1/3),还是您引用的HTML?它们是两个非常不同的问题,请说明是哪种情况。
  • @Sammitch 目标字符串是列出的文本,包括结束跨度标记,我需要专门操作该空间。虽然如果使用 作为锚点会有所帮助,我可以进行多次替换

标签: php string substr


【解决方案1】:
<?php
$subject = 'In Target(+-50%): <span style="color: red">33%</span>(1/3)<br>';
$pattern = '/<span\b[^>]*>(.*?)<\/span>(.*?)<br>/';
preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3);
$subject = str_replace($matches[1][0], 'REPLACE WITH THIS TEXT', $subject);
$subject = str_replace($matches[2][0], 'REPLACE SECOND PART WITH THIS TEXT', $subject);

print_r($subject);
?>

【讨论】:

  • 看起来不错,我想我可以使用它。谢谢
  • 如果$subject中的$pattern多次出现,为什么$matches没有包含所有的命中?我需要用新的偏移量重新运行 preg_match 吗?
  • 现在我遇到了 $matches[1][0] 出现在我的 $subject 其他地方的情况(它比我列出的要长)。如何替换匹配区域中的特定文本?
【解决方案2】:

这应该把你需要的东西分开:

preg_match('#(<span[^>]*>)(\d+\%)(</span>)(\(\d+/\d+\))#', $str, $matches);
var_dump($matches);

然后你可以使用 str_replace 来匹配。

【讨论】:

  • 你的正则表达式很具体,如果第一个值是小数或者最后一个数字不是分数怎么办?
  • 老兄,看看 OP 发布的示例字符串。我可以说你的正则表达式太笼统了。
猜你喜欢
  • 2022-01-02
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
相关资源
最近更新 更多