如何解析句子中URL末尾的句点?

时间:2011-11-10 23:01:37

标签: php regex

这是我到目前为止所拥有的:

/(^|\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 我还没有完全测试,但它似乎工作。在我测试之后,我会把它变成一个解决方案。或者,如果其他人想要积分,请随意测试,我会投票支持您的解决方案。

2 个答案:

答案 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

here online on Regexr

我将(^|\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匹配。