6

假设 $content 是 textarea 的内容

/*Convert the http/https to link */
     $content = preg_replace('!((https://|http://)+[a-z0-9_./?=&-]+)!i', '<a target="_blank" href="$1">$1</a> ', nl2br($_POST['helpcontent'])." ");
/*Convert the www. to link prepending http://*/
     $content = preg_replace('!((www\.)+[a-z0-9_./?=&-]+)!i', '<a target="_blank" href="http://$1">$1</a> ', $content." ");

这适用于链接,但意识到当图像在文本中时它会破坏标记......

我现在正在尝试这样:

$content = preg_replace('!\s((https?://|http://)+[a-z0-9_./?=&-]+)!i', ' <a href="$1">$1</a> ', nl2br($_POST['content'])." ");
$content = preg_replace('!((www\.)+[a-z0-9_./?=&-]+)!i', '<a target="_blank" href="http://$1">$1</a> ', $content." ");

像图像一样受到尊重,但问题是带有 http:// 或 https:// 格式的 url 现在不会被转换..:

google.com -> 未转换(如预期)

www.google.com -> 转换良好

http://google.com -> 未转换(意外)

https://google.com -> 未转换(意外)

我错过了什么?

-编辑-

当前几乎可行的解决方案:

$content = preg_replace('!(\s|^)((https?://)+[a-z0-9_./?=&-]+)!i', ' <a href="$2" target="_blank">$2</a> ', nl2br($_POST['content'])." ");
$content = preg_replace('!(\s|^)((www\.)+[a-z0-9_./?=&-]+)!i', '<a target="_blank" href="http://$2"  target="_blank">$2</a> ', $content." ");

这里的问题是,如果这是输入:

www.funcook.com http://www.funcook.com https://www.funcook.com funcook.com http://funcook.com https://funcook.com

我想要的所有 url(所有,除了 name.domain)都按预期转换,但这是输出

www.funcook.com http://www.funcook.com https://www.funcook.com ;funcook.com http://funcook.com https://funcook.com

注意 ; 已插入,知道为什么吗?

4

5 回答 5

8

尝试这个:

preg_replace('!(\s|^)((https?://|www\.)+[a-z0-9_./?=&-]+)!i', ' <a href="$2">$2</a> ',$text);

它将获取以 http:// 或 www 开头的链接。

例子

于 2012-07-17T19:32:00.167 回答
2

你不能100%。因为可能有诸如stackoverflow.com没有的链接www.

如果您只针对这些链接:

!(www\.\S+)!i

应该对你足够好。


编辑:至于您的最新问题,至于为什么 http 链接没有被转换但 https 可以,您的第一个模式只搜索https://,或者http://.不是这种情况。通过替换来简化它:

(https://|http://\.)

(https?://)

这将使s可选。

于 2012-07-17T19:30:20.587 回答
1

我有类似的问题。这是帮助我的功能。也许它会满足您的需求:

function clHost($Address) { 
   $parseUrl = parse_url(trim($Address)); 
   return  str_replace ("www.","",trim(trim($parseUrl[host] ? $parseUrl[host].$parseUrl[path] :  $parseUrl[path]),'/'));
}

此函数将返回没有协议和“www”的域,因此您可以稍后自己添加它们。

例如:

$url = "http://www.". clHost($link);

我是这样做的,因为我找不到好的正则表达式。

于 2012-07-24T04:12:50.333 回答
1

添加超链接的另一种方法是,您可以获取要为链接解析的文本,并将其分解为一个数组。然后使用 foreach (非常快速的函数 - http://www.phpbench.com/)循环并更改以 http://、https:// 或 www. 开头或以 .com/ 结尾的任何内容。 org/etc 到一个链接。

我在想也许是这样的:

$userTextArray = explode(" ",$userText);
foreach( $userTextArray as &$word){
    //if statements to test if if it starts with www. or ends with .com or whatever else
    //change $word so that it is a link
}

您的更改将反映在数组中,因为您在 foreach 语句中的 $userText 之前有“&”。现在只需将数组内爆回字符串即可。

这在我的脑海中是有道理的......但我不能 100% 确定这就是你要找的东西

于 2012-07-17T19:38:57.013 回答
0

\s((https?://|www.)+[a-z0-9_./?=&-]+)

问题是您的起始 \s 强制匹配以空格开头,因此,如果您没有该起始空格,则匹配失败。reg exp 很好(没有 \s),但为避免替换图像,您需要添加一些内容以避免匹配它们。

如果图像是纯 html 使用这个: (?<!src=")((https?://|www.)+[a-z0-9_./?=&-]+)

这将在 url 之前查找 src=" 以忽略它。

如果您使用其他标记,请告诉我,我会尝试找到另一种方法来避免图像。

于 2012-07-30T13:37:10.763 回答