当您有重复的子字符串时如何正确替换字符串?

Posted

技术标签:

【中文标题】当您有重复的子字符串时如何正确替换字符串?【英文标题】:How to properly replace strings when you have repeated substrings? 【发布时间】:2020-01-29 15:11:57 【问题描述】:

我想在文本中添加指向 url 的超链接,但问题是我可以有不同的格式,并且 url 可能有一些子字符串在其他字符串中重复。让我用一个例子更好地解释它:

Here I have one insidelinkhttp://google.com But I can have more formats like the followings: https://google.com google.com

现在我从上面的示例中提取了以下链接:["http://google.com", "https://google.com", "google.com"],我想用以下数组替换这些匹配项:['<a href="http://google.com">http://google.com</a>', '<a href="https://google.com">https://google.com</a>', '<a href="google.com">google.com</a>']

如果我在替换每个元素的数组上进行迭代,一旦我正确添加了"http://google.com" 的超链接,就会出现如上例中的错误,每个子字符串都将替换为来自"google.com" 的另一个超链接

有人知道如何解决这个问题吗?

谢谢

【问题讨论】:

你试过preg_replace或preg_replace_callback吗? 【参考方案1】:

根据您的示例字符串,我定义了 3 种不同的 URL 匹配模式,并根据您的要求替换它,您可以在“$regEX”变量中定义更多模式。

// string
$str = "Here I have one insidelinkhttp://google.com But I can have more formats like the followings: https://google.com google.com";

/**
 * Replace with the match pattern
 */
function urls_matches($url1)

  if (isset($url1[0])) 
    return '<a href="' . $url1[0] . '">' . $url1[0] . '</a>';
  


// regular expression for multiple patterns
$regEX = "/(http:\/\/[a-zA-Z0-9]+\.+[A-Za-z]2,6+)|(https:\/\/[a-zA-Z0-9]+\.+[A-Za-z]2,6+)|([a-zA-Z0-9]+\.+[A-Za-z]2,6+)/";

// replacing string based on defined patterns
$replacedString = preg_replace_callback(
  $regEX,
  "urls_matches",
  $str
);

// print the replaced string
echo $replacedString;

【讨论】:

非常感谢!效果很好,非常感谢您的帮助:)【参考方案2】:

您可以进行搜索并将它们替换为模板字符串。 例如:STRINGA、STRINGB、STRINGC

然后循环遍历第 0 项替换 STRINGA 的数组。 只需确保模板名称没有重叠的名称,例如 STRING1 和 STRING10

【讨论】:

以上是关于当您有重复的子字符串时如何正确替换字符串?的主要内容,如果未能解决你的问题,请参考以下文章

用其他列值pyspark替换包含美元符号($)的子字符串[重复]

如何在JAVA中用不同的子字符串替换字符串的子字符串?

替换字符串中第 n 次出现的子字符串

如何在特定字符之前替换字符串的子字符串?

如何在 Netezza 中替换完整的子字符串

渲染JSON而不替换Jinja中的字符[重复]