Php 不带最后一个puntuaction字符的类正则表达式链接匹配
我有html/文本字符串,希望将所有链接(如部分文本)匹配到带有标记的真实超链接。对于这个问题,我试图匹配“www.somesite.domen”模式。但是,如果模式接近句子末尾的标点符号,该怎么办 如何匹配没有最后一个字符(标点符号)的模式?Php 不带最后一个puntuaction字符的类正则表达式链接匹配,php,regex,Php,Regex,我有html/文本字符串,希望将所有链接(如部分文本)匹配到带有标记的真实超链接。对于这个问题,我试图匹配“www.somesite.domen”模式。但是,如果模式接近句子末尾的标点符号,该怎么办 如何匹配没有最后一个字符(标点符号)的模式? www.somesite.domen www.somesite.domen www.somesite.domen www.somesite.domen www.somesite.domen/?id=1 以下是我正在使用的函数: function make
function make_links($text)
{
return preg_replace(
array(
'/(^|\s)(www\.[^<>\s!,]+)(!$|\s|\.|\:|\!|,|\?)/iex'
),
array(
"stripslashes((strlen('\\2')>0?'\\1<a target=\"_blank\" href=\"http://\\2\">\\2</a>\\3':'\\0'))"
),
$text
);
}
函数生成链接($text)
{
返回预更换(
排列(
“/(^\s)(www\.[^\s!,]+)(!$\s\.:。!\124;\.,?)/iex”
),
排列(
“带斜杠((strlen('\\2'>0?'\\1\\3':'\\0'))”
),
$text
);
}
但是当“.”或“?”字符是句子中的最后一个字符时,我的功能是将它们也带到链接中
你知道怎么解决这个案子吗?谢谢 如果我正确理解了您的要求,您需要将文本行分成3组
- 第一组将在主机名之前保留文本
- 第二组将保留主机名
- 第三组是最后一个标点字符(或空白字符)
/^(.*?)(www(?:.\w+)+(?:\/[^.\s]+?))(!$|\s|\.|\:|\!|,|\?)?$/
使用一些文本www.host.some site.domen/?id=1?
作为示例,您将获得如下匹配:
/^(.*?)(www(?:.\w+)+(?:\/[^.\s]+?))(!$|\s|\.|\:|\!|,|\?)?$/
为了摆弄您的regexp,您可以使用
编辑
或者,这是另一个regexp
/^(.+\s)?(\w+(?:\.[-\w]+)+\.\w+(?:\/.*?)?)(!$|\s|\.|\:|\!|,|\?)?$/
我已经进行了几个测试:
- 测试文本:
。匹配组:一些东西www.host.somesite.domen/?id=1。
- 1:
一些东西
- 2:
www.host.somesite.domen/?id=1
- 3:
- 1:
- 测试文本:
。匹配组:一些东西www.host.somesite.domain.
- 1:
一些东西
- 2:
www.host.somesite.domen
- 3:
- 1:
- 测试文本:
。匹配组(仅一个):www.host.somesite.domain
- 2:
www.host.somesite.domain
- 2:
- 测试文本:
。匹配组:你好www.host.somesite.domen/mysite.
- 1:
你好
- 2:
www.host.somesite.domen/mysite
- 3:
- 1:
- 测试文本:
。匹配组:www.somesite.domen/?id=1?
- 2:
www.somesite.domen/?id=1
- 3:
?
- 2:
我希望这将有助于解决您的问题。您的文本是否包含界定域的
[]
?我的文本不包含[]
。另请参见,抱歉,[]
不是文本的一部分。我刚刚从案例中删除了它们。@Branislav,那么主机名呢,它总是www吗?在这个问题中,链接总是以www开头。因此,我必须尽可能多地匹配案例,但结尾没有标点符号。主机名也很受欢迎。正如您所知,“.”和“?”可以在URL中,但不能在最后。示例:“这是我的网站URL www.hostname.com/mysite。”