【问题标题】:Auto-link URLs in a string自动链接字符串中的 URL
【发布时间】:2010-11-10 13:17:34
【问题描述】:

我有一个正常的消息输出 $msg。如果它是链接,我希望它使其链接。 (包含 http:// 或 www.)那么它应该是 <a href="http://google.com" target="_blank">http://google.com</a>

我已经从消息中剥离了 html

$msg = htmlspecialchars(strip_tags($show["status"]), ENT_QUOTES, 'utf-8')

怎么可能,很多地方都见过。

【问题讨论】:

标签: php html


【解决方案1】:

我遇到了和@SublymeRick 一样的问题(在第一个点之后停止,请参阅Auto-link URLs in a string)。

受到https://stackoverflow.com/a/8218223/593957的一点启发,我把它改成了

$msg = preg_replace('/((http|ftp|https):\/\/[\w-]+(\.[\w-]+)+([\w.,@?^=%&amp;:\/~+#-]*[\w@?^=%&amp;\/~+#-])?)/', '<a href="\1">\1</a>', $msg);

【讨论】:

    【解决方案2】:

    为此使用正则表达式,通过 PHP 的 preg_replace() 函数。

    这样的……

    preg_replace('/\b(https?:\/\/(.+?))\b/', '<a href="\1">\1</a>', $text);
    

    说明:

    寻找被\b包围的(https?://(.+?)),这是一个词首/词尾标记。

    https?:// 很明显(s? 表示 's' 是可选的)。

    (.+?) 表示任意数量的任意字符:“任意字符”用点表示; “任意数量”是加号。问号表示它不是贪婪的,所以它会允许它后面的项目(即\b 词尾)在第一次机会时匹配。这会阻止它一直持续到字符串的末尾。

    整个表达式都放在括号中,以便它被替换系统拾取,并且可以在第二个参数中使用\1 重新插入。

    【讨论】:

    • 您不需要 2 个正则表达式,一个用于带有方案的 URL,一个用于没有方案的 URL。或者您可以使用 e 修饰符并以编程方式处理这种情况。 (+你需要在你的正则表达式中转义两个正斜杠)
    • 我尝试使用这个表达式,它在第一个点之后停止,而不是完成 url。
    【解决方案3】:

    类似:

     preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@', '<a href="$1">$1</a>', $text);
    

    也许?

    【讨论】:

      【解决方案4】:
      enter code h    function AutoLinkUrls($str,$popup = FALSE){
          if (preg_match_all("#(^|\s|\()((http(s?)://)|(www\.))(\w+[^\s\)\<]+)#i", $str, $matches)){
              $pop = ($popup == TRUE) ? " target=\"_blank\" " : "";
              for ($i = 0; $i < count($matches['0']); $i++){
                  $period = '';
                  if (preg_match("|\.$|", $matches['6'][$i])){
                      $period = '.';
                      $matches['6'][$i] = substr($matches['6'][$i], 0, -1);
                  }
                  $str = str_replace($matches['0'][$i],
                          $matches['1'][$i].'<a href="http'.
                          $matches['4'][$i].'://'.
                          $matches['5'][$i].
                          $matches['6'][$i].'"'.$pop.'>http'.
                          $matches['4'][$i].'://'.
                          $matches['5'][$i].
                          $matches['6'][$i].'</a>'.
                          $period, $str);
              }//end for
          }//end if
          return $str;
      }//end AutoLinkUrlsere
      

      【讨论】:

      • 添加一些解释,说明此答案如何帮助 OP 解决当前问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多