【发布时间】:2013-05-31 16:27:49
【问题描述】:
我正在尝试编写一个正则表达式,它将在纯文本字符串中查找 URL,以便我可以用锚标记包装它们。我知道有expressions already available for this,但我想创建自己的,主要是因为我想知道它是如何工作的。
如果我的正则表达式失败,它不会破坏任何东西,我的计划是写一些相当简单的东西。到目前为止,这意味着:1)在单词的开头匹配“www”或“http”2)继续匹配直到单词结束。
我可以做到,AFAICT。我有这个:\b(http|www).?[^\s]+
适用于foo www.example.com bar http://www.example.com 等。
问题是,如果我给它foo www.example.com, http://www.example.com,它会认为逗号是 URL 的一部分。
所以,如果我要使用一个表达式来执行此操作,我需要将“...并在您看到空格时停止”更改为“...并在您看到空格或空格之前的一段标点符号时停止”。 我不知道该怎么做。
目前,我正在考虑使用的解决方案只是添加另一个测试 - 匹配 URL,然后在下一行移动任何偷偷摸摸的标点符号。这不是那么优雅。
注意:我是用 PHP 编写的。
旁白:为什么在上面的表达式中用\b 替换\s 似乎不起作用?
预计到达时间:
谢谢大家!
根据 Explosion Pills 的建议,这就是我最终得到的结果:
function add_links( $string ) {
function replace( $arr ) {
if ( strncmp( "http", $arr[1], 4) == 0 ) {
return "<a href=$arr[1]>$arr[1]</a>$arr[2]$arr[3]";
} else {
return "<a href=" . "http://" . $arr[1] . ">$arr[1]</a>$arr[2]$arr[3]";
}
}
return preg_replace_callback( '/\b((?:http|www).+?)((?!\/)[\p{P}]+)?(\s|$)/x', replace, $string );
}
我添加了一个回调,以便所有链接都以 http:// 开头,并对它处理标点符号的方式做了一些调整。
这可能不是最好的做事方式,但它确实有效。在过去的一段时间里,我学到了很多这方面的知识,但还有很多东西要学!
【问题讨论】:
-
嗨@Nick,欢迎来到SO。 +1 格式正确的问题 :)
-
谢谢,谢谢!