这是我目前所拥有的:
/(^|\s)(http:\/\/(\S+)(?!(.png|.gif|.jpg)($|\.\s|\.$|\s)))($|\.\s|\.$|\s)/i
我正在这样替换它:
'$1<a href="$2">$2</a>$6'
有时,我的用户会键入如下内容:http://google.com . <- 如何在不解析 URL 中的其他句点的情况下避免包含最后一个句点?
此外,如果您想知道 .gif .png 等的用途,我正在解析图像以自动创建元素。
编辑: 这是针对 PHP 的。
这是一个论坛,用户可以在其中发布很多内容,包括链接。它成功地处理了除了 URL 后面的标点符号之外的所有情况。
编辑 2: 解析可能是错误的词。我并不想删除标点符号,只是将其与 URL 分开,这样我就可以向我的用户显示有效链接。
编辑 3: http://daringfireball.net/2010/07/improved_regex_for_matching_urls 我还没有完全测试,但它似乎工作。我会在测试后将其作为解决方案。或者,如果其他人想要积分,请随时进行测试,我会为您的解决方案投票。
最佳答案
如此更新的解决方案:
/\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
在第二组。
关于php - 如何解析句子中URL末尾的句号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8087612/