正则表达式匹配没有``标签的链接
正则表达式匹配没有``标签的链接
这是我的正则表达式,用于在字符串中匹配链接,但我不希望它选择每个链接。如果链接之前有\">
,或者之后有,那么这个链接就不应该被匹配。如何实现这个要求?\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为什么我需要这个?:我希望每个链接都可以被点击,即使它不在锚点标签之间。
正文:
问题描述:如何使用正则表达式匹配没有``标签的链接?
问题原因:正则表达式没有包含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)
问题的原因是需要在一段文本中匹配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)
使用正则表达式解析HTML时,要注意一些免责声明。如果你想使用正则表达式来匹配没有标签的链接,可以使用以下代码:
$regex="~<a.*?</a>(*SKIP)(*F)|http://\S+~";
参见演示。
这个问题是一个经典案例,可以在这个问题的解释中找到相应的技巧:"regex-match a pattern, excluding..."。
交替符号|
的左边匹配完整的<a ...tags </a>
标签,然后故意失败,之后引擎会跳到字符串中的下一个位置。右边匹配URL,我们知道它们是正确的,因为它们没有被左边的表达式匹配到。
右边的URL正则表达式可以进行调整,根据需求使用适当的表达式。
参考资料
- How to match (or replace) a pattern except in situations s1, s2, s3...
- Article about matching a pattern unless...
我在你的模式末尾添加了自己的模式(<a.*?</a>(*SKIP)(*F)|
),它起作用了!谢谢。
15分钟前,我还没有足够的声望来投票赞成。但现在我的声望是19,我已经投票赞成了。再次感谢。
这里的(*SKIP)(*F)是什么意思?
如何使这个正则表达式适用于Java/Apex,起初它会报错Invalid string literal,我通过转义一些字符来消除了错误,但之后它就不再起作用了,有什么帮助吗?