如何将URL转换为Markdown语法,但不会干扰Markdown语法中已有的URL?

时间:2009-03-27 14:48:33

标签: php regex

我正在编写的系统使用Markdown修改链接,但我也希望使纯链接处于活动状态,以便键入http://www.google.com将成为活动链接。为此,我使用正则表达式替换来查找URL,并使用Markdown语法重写它们。问题是我不能让正则表达式也不解析Markdown语法中的链接。

我正在使用以下代码:

$value = preg_replace('@((?!\()https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@', '[$1]($1)', $value);

这适用于普通链接,例如http://www.google.com,但我需要忽略已经采用Markdown格式的链接。我认为该节(?!()会阻止它匹配括号后面的网址,但似乎我错了。

我意识到即使这不是一个理想的解决方案(如果它有效),但这超出了我的正则表达能力。

2 个答案:

答案 0 :(得分:1)

我认为(?<!\()就是你的意思。如果匹配位置位于http://www.google.com的开头,则不是您需要检查的下一个字符,而是之前的字符。换句话说,你需要一个负面的 lookbehind ,而不是负面的 lookahead

答案 1 :(得分:0)

正则表达式在这样的事情上是出了名的糟糕,你可能会得到你从未想过的各种聪明的HTML漏洞。 IMO你应该修改markdown脚本来标记它们看到的markdown URL,这样你就可以忽略标记的URL,当你发现它们都是一个非常简单的搜索时,不会给hack带来复杂性。