gpt4 book ai didi

php - 将 url 转换为字符串中的链接,除非它们位于 html 标记的属性中

转载 作者:可可西里 更新时间:2023-10-31 22:05:53 26 4
gpt4 key购买 nike

我正在尝试从文本区域输入 ($_POST['content']) 转换所有要链接的 url。

$content = preg_replace('!(\s|^)((https?://)+[a-z0-9_./?=&-]+)!i', ' <a href="$2" target="_blank">$2</a> ', nl2br($_POST['content'])." ");
$content = preg_replace('!(\s|^)((www\.)+[a-z0-9_./?=&-]+)!i', '<a target="_blank" href="http://$2" target="_blank">$2</a> ', $content." ");

目标链接格式:www.hello.comhttp(s)://(www).hello.com

但这似乎会破坏任何 iframe、图像或类似内容,

将忽略 html 标记中的 url 的正确正则表达式如何?

注意:我知道我需要两个表达式;一个用于检测无协议(protocol)链接(如 www.hello.com,因此我需要在其前面加上),另一个用于检测带有协议(protocol)的 url(因此无需在前面加上)。

最佳答案

你的代码在 iframe 等中应该不是什么大问题,因为在那里你通常有一个 "在您的 URL 前面而不是空格,因为您的模式需要。

但是,这里有不同的解决方案。如果你有一个 <,它可能无法 100% 工作。或 >在 HTML 注释或类似内容中。但在任何其他情况下,它应该能很好地为您服务(我不知道这对您来说是否是个问题)。它使用否定前瞻来确保没有结束 >开场前 < (因为这意味着您在标签内)。

$content = preg_replace('$(\s|^)(https?://[a-z0-9_./?=&-]+)(?![^<>]*>)$i', ' <a href="$2" target="_blank">$2</a> ', $content." ");
$content = preg_replace('$(\s|^)(www\.[a-z0-9_./?=&-]+)(?![^<>]*>)$i', '<a target="_blank" href="http://$2" target="_blank">$2</a> ', $content." ");

如果您不熟悉这种技术,这里有一些详细说明。

(?!        # starts the lookahead assertion; now your pattern will only match, if this subpattern does not match
[^<>] # any character that is neither < nor >; the > is not strictly necessary but might help for optimization
* # arbitrary many of those characters (but in a row; so not a single < or > in between)
> # the closing >
) # ends the lookahead subpattern

请注意,我更改了正则表达式分隔符,因为我现在使用的是 !在正则表达式中。

除非你需要第一个子模式(\s|^)对于标签之外的 URL,您现在也可以将其删除(并减少替换中的捕获变量)。

$content = preg_replace('$(https?://[a-z0-9_./?=&-]+)(?![^<>]*>)$i', ' <a href="$1" target="_blank">$1</a> ', $content." ");
$content = preg_replace('$(www\.[a-z0-9_./?=&-]+)(?![^<>]*>)$i', '<a target="_blank" href="http://$1" target="_blank">$1</a> ', $content." ");

最后...您是否打算不替换末尾包含 anchor 的 URL?例如。 www.hello.com/index.html#section1 ?如果您不小心错过了这个,请添加 #到您允许的 URL 字符:

$content = preg_replace('$(https?://[a-z0-9_./?=&#-]+)(?![^<>]*>)$i', ' <a href="$1" target="_blank">$1</a> ', $content." ");
$content = preg_replace('$(www\.[a-z0-9_./?=&#-]+)(?![^<>]*>)$i', '<a target="_blank" href="http://$1" target="_blank">$1</a> ', $content." ");

编辑:另外,+ 又如何呢?和 % ?还有一些其他字符可以在不经过编码的情况下出现在 URL 中。 See this. 编辑结束

我认为这应该可以解决您的问题。但是,如果您可以提供一个示例来显示工作 URL 和损坏的 URL(使用您拥有的代码),我们实际上可以提供经过测试适用于您的所有情况的解决方案。

最后一个想法。正确的解决方案是 to use a DOM parser .然后你可以简单地将你已经拥有的正则表达式应用于文本节点。但是,您对 HTML 结构的关注非常有限,这使您的问题再次成为常规问题(只要您在 HTML 注释或页面上的 JavaScript 或 CSS 中没有不匹配的“<”或“>”)。如果您确实有这些特殊情况,那么您真的应该研究一下 DOM 解析器。在这种情况下,此处介绍的所有解决方案(到目前为止)都不是安全的。

关于php - 将 url 转换为字符串中的链接,除非它们位于 html 标记的属性中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12538358/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com