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

3

以下是我目前的进展:

/(^|\s)(http:\/\/(\S+)(?!(.png|.gif|.jpg)($|\.\s|\.$|\s)))($|\.\s|\.$|\s)/i

我将其替换为以下内容:

'$1<a href="$2">$2</a>$6'

有时候,我的用户会输入类似这样的内容:http://google.com。 <- 我如何避免包含URL中的末尾句点而不解析其他在URL中的句点?
另外,如果你想知道.gif .png等是用来干什么的,我正在解析图像以自动创建img标签。
编辑: 这是为PHP而做的。
这是一个论坛,用户发布很多帖子,其中包括链接。它可以成功地处理除URL后面的标点符号之外的所有情况。
第二次编辑: 解析可能是错误的词。我不想删除标点符号,只是将其与URL分开,以便向我的用户显示可工作的链接。
第三次编辑: http://daringfireball.net/2010/07/improved_regex_for_matching_urls 我还没有完全测试,但它似乎有效。我会在测试之后把它作为解决方案。或者如果有人想得到积分,请随意测试,我会投票支持你的解决方案。

如果您不必使用正则表达式,更简单和高效的解决方案是检查字符串的最后一个字符是否为句号,然后将其删除。 - Aurelio De Rosa
2个回答

2

因此,更新的解决方案是:

/\b(http:\/\/(\S+(?<!\.)(?=(?:$|\s|\.(?:$|\s)))))(?<!(?:\.(?:png|gif|jpg)))/i

在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


我喜欢这些变化,但是当字符串中有多个URL时它就失败了。它将第二个URL保留为字符串(而我的原始代码处理正确)。 - Stephane
@Stephane,它不是在多个URL上失败,而是在没有点在末尾的URL上失败。已更正正则表达式并更新了Regexr链接。现在有点复杂了。 - stema

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";

我正在使用PHP将URL替换为链接。我不想去除任何内容。 - Stephane
好的,但是你能否匹配并创建一个链接,将我现在输入的内容http://google.com转换成链接。它不总是在结尾!Stackoverflow做得很好! - Stephane
它仍然没有正常工作。这是测试字符串:http://google.com。和http://google.png。和http://google.com(SO正在删除http://)。 - Stephane
你在改变目标。你能更好地布置你的测试用例和预期结果吗?例如,当用户创建到google.png的链接时,你希望发生什么?你的代码是否应该知道.png是有效的顶级域名?当缺少"http://"时,你想让它自动添加吗?等等。 - bigendian
抱歉。(谢谢)我的要求是,无论有多少个URL,都要被替换为锚点,即使有尾随标点符号。现在,我已经让它查找空格,这样可以正常工作,但是我有一些用户在句子中使用URL,并且结尾的句号会包含在href中,从而破坏链接。这样清楚吗?图片的事情与此无关。我只是试图解释那个正则表达式已经在做什么。 - Stephane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接