【问题标题】:convert multiple text urls beginning in either www or http to absolute links将以 www 或 http 开头的多个文本 url 转换为绝对链接
【发布时间】:2011-07-05 14:07:43
【问题描述】:

有很多类似的问题,但我已经尝试了大约 15 个不同的 preg_match 示例,但没有一个完全有效。

我有很多用户提交的内容,其中大部分都有 url.. 有时以 http://www.site.com/page 的形式,有时像 www.site.com 并且经常包含在括号中 (www.site.com/page.html )。

我没有找到一种能够解析字符串并将所有这些转换为绝对 html 链接的模式。想知道是否有人可以帮助我。我发现了一些正则表达式,它们似乎可以工作,但是当有些带有 http 而有些没有...时,我不知道如何正确转换为绝对 html 链接...

以下是我尝试过的几个表达方式:

function makeLinks($text) {  
    $text = preg_replace('(((f|ht){1}tp://)[-a-zA-Z0-9@:%_\+.~#?&//=]+)',
        '(<a href="\\1">\\1</a>)', $text);  
    $text = preg_replace('(www\.[a-zA-Z0-9\-]\.[^ ]+)',
        '(<a href="\\1">\\1</a>)', $text);  

        return $text;
}

function makeLinks($text) {
    $text = preg_replace('~(?:www|http://)\S+~', '<a href="$0">$0</a>', $text);

        return $text;
}

function makeLinks($text) {
    $text = preg_replace( '@(?<![.*">])\b(?:(?:https?|ftp|file)://|[a-z]\.)[-A-Z0-9+&#/%=~_|$?!:,.]*[A-Z0-9+&#/%=~_|$]@i', '<a href="\0" target="_blank">\0</a>', $text );

        return $text;
}

【问题讨论】:

  • 对不起,但也许一些示例代码将有助于解释您正在尝试实现的目标。就像您之前说您尝试过的代码一样。
  • 以 www 或 http 开头的 URL 是绝对链接。我不确定你想要完成什么。现在,没有 http:// 的地址可能无法正确解释(由古老/损坏的浏览器),但无论如何,这些都是绝对链接,添加“http://”的正则表达式将是微不足道的。再说一次,我不明白你的问题。能详细点吗?
  • 或者您可能想从您的 URL 中删除域名 + 协议
  • 为什么它必须是一个正则表达式解决方案?

标签: php regex url replace


【解决方案1】:

这是一个好的开始:

function makeLinks($text) {
    $text = preg_replace('~(?:www|http://)\S+~', '<a href="$0">$0</a>', $text);
    return $text;
}

$0 是完全匹配。如果您只对没有http://www.http://www. 的部分进行分组,则可以将其连接到前面。

如果你还在寻找答案,试试这个:

function makeLinks($text) {
    $text = preg_replace('~(?:http://|)(?:www\.|)(\S+)~', '<a href="http://www.$1">$0</a>', $text);
    return $text
}

【讨论】:

  • 这对我不起作用...它把每个单词都变成了超链接
  • 抱歉,试试~\b(?:http://www.|http://(?!www.)|(?&lt;!http://)www.)(?:\.|)(\S+)\b~
  • 我没有得到预期的结果。请在功能流程中使用正确的变量。 ex: ($tect, $text, $test) 用来表示单个变量。
  • @Navane 抱歉,这是一个错字。我将为查看此页面的任何人修复它,但已经有一个可接受的答案。
【解决方案2】:

我最终使用了这个似乎在所有必要情况下都表现良好的字符串:

function makeLinks($text) {
    $text = preg_replace('%(((f|ht){1}tp://)[-a-zA-^Z0-9@:\%_\+.~#?&//=]+)%i',
    '<a href="\\1">\\1</a>', $text);
    $text = preg_replace('%([[:space:]()[{}])(www.[-a-zA-Z0-9@:\%_\+.~#?&//=]+)%i',
    '\\1<a href="http://\\2">\\2</a>', $text);

        return $text;
}

【讨论】:

  • 你必须添加!并且,在您的正则表达式中并添加 [s]?在 https 的第一个 preg 中:$text = preg_replace('%(((f|ht){1}tp[s]?://)[-a-zA-^Z0-9@:\%_\+.,!~#?&amp;//=]+)%i','&lt;a href="\\1"&gt;\\1&lt;/a&gt;', $text); $text = preg_replace('%([[:space:]()[{}])(www.[-a-zA-Z0-9@:\%_\+.,!~#?&amp;//=]+)%i','\\1&lt;a href="http://\\2"&gt;\\2&lt;/a&gt;', $text); 有,和!在某些 URL 中(例如 metronews.fr)
  • 我还必须在正则表达式中添加 ) 和 (。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 2021-11-29
  • 1970-01-01
  • 2013-11-06
相关资源
最近更新 更多