替换多个字符串而不重叠

时间:2017-03-31 11:43:51

标签: php regex str-replace

我有PHP应用程序,我必须用它们各自的链接替换一大堆字符串。基本上我得到一个可能的替换列表,看起来像这样:

"Table 1" => "<a href='SOME_LINK'>Table 1</a>"
"Table 2" => "<a href='SOME_LINK'>Table 2</a>"
...
"Table 10" => "<a href='SOME_LINK'>Table 10</a>"
"Table 11" => "<a href='SOME_LINK'>Table 11</a>"

我浏览了每一对,然后给每个值调用str_replace。问题是即使在第一次传递时我也会捕获Table 10字符串以及Table 1字符串,并且我将两者都替换为错误。所以我最终得到的结果有<a href='SOME_LINK'>Table 1</a>0Table 10根本不应被替换(除非之后还有另一对实际负责Table 10)。

任何解决方案的想法?我虽然在字符串的搜索部分之后添加了一个空格,但它可能会在Table 1,这样的文本中出现一些根本不匹配的内容。我还考虑使用正则表达式来替换但不确定是否存在可以解决上述问题的语法。

编辑: 为了提高阅读理解,这里是这个问题的预期输入和输出。 条件:

"Table 1" => "<a href='SOME_LINK'>Table 1</a>"
"Table 10" => "<a href='SOME_LINK'>Table 10</a>"

INPUT:

We have some text here.
It has words like Table 1, Table 2 and also Table 10.
Those need to be replaced.

输出:

We have some text here.
It has words like <a href='SOME_LINK'>Table 1</a>, Table 2 and also <a href='SOME_LINK'>Table 10</a>.
Those need to be replaced.

2 个答案:

答案 0 :(得分:0)

由于有更多信息的评论,请再次修改答案。

您可以使用正则表达式搜索表格,例如,以PHP代码:

$input = "We have some text here.
It haswords like Table 1, Table 2 and also Table 10.
Those need to be replaced.";

$output = preg_replace("/(Table 1)(?![\d])/U", "<a href=\"LINK HERE\">LINK TEXT</a>", $input);

echo "Input:<br>".$input."<br><br>Output:<br>".$output;

似乎PHP处理一些正则表达式选项的方式与我个人的预期不同。此代码在测试服务器中为我工作(用2或10替换“表1”仅替换正确的部分)。如果您想要不区分大小写的搜索,请在正则表达式中的U旁边添加i。

答案 1 :(得分:0)

作为一种解决方法,如何使用密钥长度降序对数组进行排序,并使用正则表达式仅替换未由<a>标记封装的字符串?

这样您就可以在Table 10之前替换Table 1,并且不会进行任何双重替换。

编辑: 这是一个按要求的例子

$input = "We have some text here.
  It has words like Table 1, Table 2 and also Table 10.
  Those need to be replaced.";

$replacements = [
  "Table 1" => "<a href='SOME_LINK'>Table 1</a>",
  "Table 2" => "<a href='SOME_LINK'>Table 2</a>",
  "Table 10" => "<a href='SOME_LINK'>Table 10</a>",
];

uksort($replacements, function($a, $b) {
  return strlen($b) - strlen($a);
});

foreach ( $replacements as $key => $value ) {
  $input = preg_replace('/([^>])'.$key.'/', '$1'.$value, $input);
}

// Show the result
print($input);

此示例在替换键之前需要空格。如果用例不允许,应该可以对其进行修改。
我已经更新了示例,以便在搜索键之前对该字符进行不可知。