这是我到目前为止所拥有的:
/(^|\s)(http:\/\/(\S+)(?!(.png|.gif|.jpg)($|\.\s|\.$|\s)))($|\.\s|\.$|\s)/i
我正在替换它:
'$1<a href="$2">$2</a>$6'
有时,我的用户输入的内容如下:http://google.com。 &lt; - 如何在不解析URL中的其他句点的情况下避免包括最后一段时间?
另外,如果你想知道.gif .png等是什么,我正在分析图像以自动创建元素。
编辑: 这适用于PHP。
这是一个用户发布包括链接在内的很多内容的论坛。它成功地处理了除URL之后的标点符号以外的所有情况。
编辑2: 解析可能是错误的词。我不是要删除标点符号,只是将其与URL分开,这样我就可以向用户显示一个工作链接。
编辑3: http://daringfireball.net/2010/07/improved_regex_for_matching_urls 我还没有完全测试,但它似乎工作。在我测试之后,我会把它变成一个解决方案。或者,如果其他人想要积分,请随意测试,我会投票支持您的解决方案。
答案 0 :(得分:1)
PHP解决方案:
$line = 'http://www.google.com.';
echo preg_replace(
"/(\s*)((http:\/\/)?(\S+?(.png|.gif|.jpg)?))(\W*)$/i",
'$1<a href="$2">$2</a>$6',
$line), "\n";
答案 1 :(得分:1)
如此更新的解决方案:
/\b(http:\/\/(\S+(?<!\.)(?=(?:$|\s|\.(?:$|\s)))))(?<!(?:\.(?:png|gif|jpg)))/i
我将(^|\s)
替换为\b
,这就是您想要的字边界。
致(\S+)
我改为(\S+(?<!\.)(?=(?:$|\s|\.(?:$|\s))))
。基本上我匹配每个非空格,直到前面有$|\s|\.(?:$|\s)
而左边没有点((?<!\.)
部分)。
以下展望需要深入了解。
然后我清理了你的括号和替换,并使用了一些非捕获组(以(?:
开头的组)
因此,对于您的测试字符串users type something like this: http://google.com. <- How do I avoid
,它会在第一组中与http://google.com
匹配,在第二组中与google.com
匹配。