【问题标题】:Regex to replace tags in a string in PHP正则表达式替换PHP中字符串中的标签
【发布时间】:2014-07-20 18:38:57
【问题描述】:

我正在使用下面的 PHP 和正则表达式来搜索一个巨大的字符串

[LINK]www.anyurl.com[/LINK]

并将其替换为:

<a href="http://www.anyurl.com">http://www.anyurl.com</a>

如果 URL 前面不存在 http 或 ftp,则在前面添加 http://。

$re = '/\[LINK]((?:(?!(http|ftp)|\[\/LINK]).)*)\[\/LINK]/i'; 
$subst = '[LINK]http://$1[/LINK]'; 
$xtext = preg_replace($re, $subst, $xtext, 1);
$xtext = preg_replace("/(\[LINK\])(\S*)(\[\/LINK])/", "<a href=\"$2\" target='_blank'>$2</a>", $xtext);

我的问题是它似乎只适用于它所涉及的第一个匹配项,而不适用于文档中的其他 [LINK]www.urls.com[/LINK]。文档为$xtext

【问题讨论】:

  • 我现在并不聪明,但感谢您的评论
  • @developerwjk 我没有解析 HTML 标签。 [LINK] [/LINK] 什么时候变成了 HTML 标签?
  • @MikeC 这里的人可能是无知的,只是讨厌正则表达式。
  • @MathewFoscarini 我不介意,但他们可以提供解决方案,而不仅仅是说出他们所说的话。我上面的解决方案速度很快,效果很好,但我需要重复。我希望那些攻击者实际上并不了解他们所看到的。
  • PHP 有一个BBCode built-in extension

标签: php regex url


【解决方案1】:

在第一个表达式中,需要删除 1,正如您已经发现的那样。请注意,第二个表达式与您的第二个表达式相同,但将 * 替换为 +?,并删除了标签周围不必要的捕获组。 * 不会在第一个 [\LINK] 处停止,而是在最后一个处停止,从而导致带有显示文本的链接,例如 http://www.google.com[/LINK]\n[LINK]http://www.yahoo.com,因此需要 +?

$xtext = '[LINK]www.google.com[/LINK]\n[LINK]www.yahoo.com[/LINK]';

$re = '/\[LINK]((?:(?!(http|ftp)|\[\/LINK]).)*)\[\/LINK]/i';
$subst = '[LINK]http://$1[/LINK]';
$xtext = preg_replace($re, $subst, $xtext, 1);

$xtext = preg_replace("/\[LINK\](\S+?)\[\/LINK]/", "<a href='$1' target='_blank'>$1</a>", $xtext);

【讨论】:

  • 您并没有首先检查链接是否预先添加了 http 或 ftp。我的检查链接是 [LINK]www.example.com[/LINK] 还是 [LINK]example.com[/LINK],如果是前者,则在其前面加上 http://。
  • @developerwjk 你的表达式用我的 (\S*) 代替你的 (\S+?) 需要 58 次迭代,而我的需要 32 次。我会坚持使用我的。我看不出你在哪里合理化了你的例子中的捕获组???无论如何我解决了这个问题,你开始辱骂,给了我 2 个不正确的答案,所以我们把它留在那里。
  • @MikeC,辱骂?我在解释 j_mcnally 的评论。
【解决方案2】:

我认为您的问题可能是您的第一个正则表达式的贪婪。当您在第一个找到的链接前添加 http:// 时,所有其他链接都将保持不变。所以请尝试(注意第一行的附加问号):

$re = '/\[LINK]((?:(?!(http|ftp)|\[\/LINK]).)*?)\[\/LINK]/i'; 
$subst = '[LINK]http://$1[/LINK]'; 
$xtext = preg_replace($re, $subst, $xtext);
$xtext = preg_replace("/(\[LINK\])(\S*)(\[\/LINK])/", "<a href=\"$2\" target='_blank'>$2</a>", $xtext);

【讨论】:

    【解决方案3】:

    哎呀,我刚刚发现我的错误,它是如此简单。在我的第三行:

    $xtext = preg_replace($re, $subst, $xtext, 1);
    

    我在 preg_replace 末尾有 1 ,即替换一次。这应该设置为 -1 或留空以替换所有内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多