Php 结尾无点链接的正则表达式

Php 结尾无点链接的正则表达式,php,regex,Php,Regex,我正在寻找创建一个正则表达式,它匹配在末尾没有点的链接。我知道FQDN的末尾总是有根点,但我正在开发一个博客服务。我需要处理博客文章,显然有些用户在完成他们的文章时会用一个链接,然后用一个点来完成他们的句子 这些文本看起来像: 示例文本。。。https://example.com/site. 此处有更多文本… 这里的问题是,它没有链接到任何网页。在的帮助下,我创建了以下PHP函数: function modifyText($text) { $url = '/(http|https)\:\

我正在寻找创建一个正则表达式,它匹配在末尾没有点的链接。我知道FQDN的末尾总是有根点,但我正在开发一个博客服务。我需要处理博客文章,显然有些用户在完成他们的文章时会用一个链接,然后用一个点来完成他们的句子

这些文本看起来像:

示例文本。。。https://example.com/site. 此处有更多文本…

这里的问题是,它没有链接到任何网页。在的帮助下,我创建了以下PHP函数:

function modifyText($text) {
    $url = '/(http|https)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/';
    $string= preg_replace($url, '<a href="$0" target="_blank">$0</a>', $text);
    return $string;
}
函数修改文本($text){
$url='/(http | https)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/';
$string=preg_replace($url,,$text);
返回$string;
}
通过上面的示例,此代码生成

示例文本。。。此处有更多文本…

但它应该会产生


示例文本。此处有更多文本…

一个选项是,在末尾延迟重复非空格字符,并向前查找零个或多个
s,后跟空格或字符串结尾:

'/https?:\/\/[a-z0-9.-]+\.[a-z]{2,3}(\/\S*?(?=\.*(?:\s|$)))?/i'

也可以在非点后重复点,以避免懒惰:

'/https?:\/\/[a-z0-9.-]+\.[a-z]{2,3}(\/\.*[^.]+(?=\.*(?:\s|$)))?/i'

另一个选项是使用负查找
\S
后面的“?”来断言左侧的内容不是点:

https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,3}(?:\/\S*(?<!\.))?
结果

Example text... <a href="https://example.com/site" target="_blank">https://example.com/site</a>. More text here... <a href="https://example.com/site" target="_blank">https://example.com/site</a>
示例文本…此处有更多文本。。。

这解决了这个问题,但我在这里遇到了一个新的问题。TLD可以有2或3个以上的字符(我现在将其设置为9),URL类似于
(https://example.longtld)
匹配括号将其更改为9确实看起来效果不错:与第二种模式类似,使用字符集匹配
s,然后是一个负数字符集,用于匹配结尾处除<代码>以外的任何内容:解决这个问题,但我在这里遇到了另一个问题,请参见另一个答案下的讨论,下面是一个示例,您可以创建一个字符类
[]
,以检查结尾处是否不是点或右括号
Example text... <a href="https://example.com/site" target="_blank">https://example.com/site</a>. More text here... <a href="https://example.com/site" target="_blank">https://example.com/site</a>