正则表达式匹配没有``标签的链接

33 浏览
0 Comments

正则表达式匹配没有``标签的链接

这是我的正则表达式,用于在字符串中匹配链接,但我不希望它选择每个链接。如果链接之前有\">,或者之后有,那么这个链接就不应该被匹配。如何实现这个要求?\n这些链接应该被匹配:\n

adasdas http://www.stackoverflow.com asdasas
adasdasahttp://www.stackoverflow.com/something asdas

\n这些链接不应该被匹配:\n

adasdas           http://www.stackoverflow.com     asdasas
adasdasahttp://www.stackoverflow.com/something asdas

\n为什么我需要这个?:我希望每个链接都可以被点击,即使它不在锚点标签之间。

0
0 Comments

正文:

问题描述:如何使用正则表达式匹配没有``标签的链接?

问题原因:正则表达式没有包含lookaround(前后环视)的语法。

解决方法:在正则表达式中添加lookaround语法。

参考链接:

- [Regular expression negative lookahead](https://stackoverflow.com/a/1749956/382736)

- [Lookahead and Lookbehind Zero-Length Assertions](http://www.regular-expressions.info/lookaround.html)

正文:

有时候我们需要使用正则表达式来匹配一段文本中的链接,但是希望排除掉那些包含``标签的链接。然而,我们可能会发现正则表达式无法很好地实现这个需求。

在解决这个问题之前,我们需要了解一下正则表达式的基本语法和特性。正则表达式是一种用于匹配和操作文本的工具,它由一系列字符和特殊字符组成。我们可以使用正则表达式来查找、替换和验证文本。

对于这个特定的问题,我们可以使用正则表达式来匹配没有``标签的链接。然而,我们可能会发现正则表达式无法正确地排除掉那些包含``标签的链接。

问题的原因在于,我们没有在正则表达式中使用lookaround(前后环视)的语法。Lookaround是一种特殊的语法,它允许我们在匹配过程中查看前面或后面的内容,而不会将其包含在最终的匹配结果中。

为了解决这个问题,我们可以参考一些相关的文档和示例。在Stack Overflow网站上,有一个回答提供了一个解决方案,即在正则表达式中添加lookaround语法。具体来说,我们可以使用negative lookahead来指定一个条件,即不匹配包含``标签的链接。

另外,在一个名为"Lookahead and Lookbehind Zero-Length Assertions"的网页上,我们还可以找到更多关于lookaround语法的说明和示例。这些资源可以帮助我们更好地理解和应用lookaround语法。

总结起来,要解决正则表达式无法匹配没有``标签的链接的问题,我们需要了解并使用lookaround语法。通过添加negative lookahead条件,我们可以有效地排除掉那些包含``标签的链接,从而得到我们想要的结果。

参考链接:

- [Regular expression negative lookahead](https://stackoverflow.com/a/1749956/382736)

- [Lookahead and Lookbehind Zero-Length Assertions](http://www.regular-expressions.info/lookaround.html)

0
0 Comments

问题的原因是需要在一段文本中匹配URL链接,并将其替换为带有标签的链接,但是原始文本中可能已经存在标签,需要排除这些已经存在的标签进行替换。

解决方法是使用PHP中的正则表达式函数preg_replace()来进行匹配和替换。首先,使用正则表达式'"<a[^>]+>.+?</a>(*SKIP)(*FAIL)|\b(?:https?)://\S+"'来匹配URL链接,其中使用(*SKIP)(*FAIL)排除已经存在的标签。然后,使用替换模式'<a href="$0">$0</a>'将匹配到的URL链接替换为带有标签的链接。

另外,还有一个类似的匹配和替换操作,用于匹配和替换邮箱地址。使用正则表达式'"<a[^>]+>.+?</a>(*SKIP)(*FAIL)|\b(\S+@\S+\.\S+)\S+"'来匹配邮箱地址,然后使用替换模式'<a href="mailto:$0">$0</a>'将匹配到的邮箱地址替换为带有标签的邮箱链接。

最后,将匹配和替换后的文本作为函数的返回值。

以上是解决这个问题的方法,可以参考下面的PHP代码示例。示例中还包含了使用这个函数的演示。

function replace_links( $content ){
    $content = preg_replace('"<a[^>]+>.+?</a>(*SKIP)(*FAIL)|\b(?:https?)://\S+"', '<a href="$0">$0</a>', $content);
    $content = preg_replace('"<a[^>]+>.+?</a>(*SKIP)(*FAIL)|\b(\S+@\S+\.\S+)\S+"', '<a href="mailto:$0">$0</a>', $content);
    return $content;
}
// 示例
$content = 'Here is a URL: https://example.com and an email address: test@example.com';
$content = replace_links($content);
echo $content;

输出结果:

Here is a URL: https://example.com and an email address: test@example.com

可以通过以下链接查看最新代码示例:
[https://glot.io/snippets/g6nwd6amyo](https://glot.io/snippets/g6nwd6amyo)
最新更新:
[https://gist.github.com/tripflex/0cc930c2afe5f4c73f2aed61cedf95d0](https://gist.github.com/tripflex/0cc930c2afe5f4c73f2aed61cedf95d0)

0
0 Comments

使用正则表达式解析HTML时,要注意一些免责声明。如果你想使用正则表达式来匹配没有标签的链接,可以使用以下代码:

$regex="~<a.*?</a>(*SKIP)(*F)|http://\S+~";

参见演示

这个问题是一个经典案例,可以在这个问题的解释中找到相应的技巧:"regex-match a pattern, excluding..."

交替符号|的左边匹配完整的<a ...tags </a>标签,然后故意失败,之后引擎会跳到字符串中的下一个位置。右边匹配URL,我们知道它们是正确的,因为它们没有被左边的表达式匹配到。

右边的URL正则表达式可以进行调整,根据需求使用适当的表达式。

参考资料

我在你的模式末尾添加了自己的模式(<a.*?</a>(*SKIP)(*F)|),它起作用了!谢谢。

15分钟前,我还没有足够的声望来投票赞成。但现在我的声望是19,我已经投票赞成了。再次感谢。

这里的(*SKIP)(*F)是什么意思?

如何使这个正则表达式适用于Java/Apex,起初它会报错Invalid string literal,我通过转义一些字符来消除了错误,但之后它就不再起作用了,有什么帮助吗?

0