我正在编写的系统使用Markdown修改链接,但我也希望使纯链接处于活动状态,以便键入http://www.google.com
将成为活动链接。为此,我使用正则表达式替换来查找URL,并使用Markdown语法重写它们。问题是我不能让正则表达式也不解析Markdown语法中的链接。
我正在使用以下代码:
$value = preg_replace('@((?!\()https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@', '[$1]($1)', $value);
这适用于普通链接,例如http://www.google.com
,但我需要忽略已经采用Markdown格式的链接。我认为该节(?!()会阻止它匹配括号后面的网址,但似乎我错了。
我意识到即使这不是一个理想的解决方案(如果它有效),但这超出了我的正则表达能力。
答案 0 :(得分:1)
我认为(?<!\()
就是你的意思。如果匹配位置位于http://www.google.com
的开头,则不是您需要检查的下一个字符,而是之前的字符。换句话说,你需要一个负面的 lookbehind ,而不是负面的 lookahead 。
答案 1 :(得分:0)
正则表达式在这样的事情上是出了名的糟糕,你可能会得到你从未想过的各种聪明的HTML漏洞。 IMO你应该修改markdown脚本来标记它们看到的markdown URL,这样你就可以忽略标记的URL,当你发现它们都是一个非常简单的搜索时,不会给hack带来复杂性。