【问题标题】:Converting text to link - php regex issue将文本转换为链接 - php regex 问题
【发布时间】:2012-02-23 09:53:28
【问题描述】:

我在将纯文本转换为 url 时遇到了一点问题。 我喜欢的是,如果我有这样的文字:www.google.com,它会转换为

<a href="www.google.com" target="_blank">www.google.com</a>

我有点像 RegEx 菜鸟,但我试过这个:

$description = preg_replace('@(www.([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="$1" target="_blank">$1</a>', $description);

description var 是一段文本,可以包含未转换的 url。

通过上面的代码,我得到了这个链接:

<a target="_blank">www.google.com</a>

所以省略了 href 部分。对于您的 RegEx 向导来说,这一定是小菜一碟,所以提前感谢您的每一个帮助。

如果有另一种(更好的?)方法可以将纯文本转换为 url,你可以这样说,我会试试的。

【问题讨论】:

  • 我已尝试运行您的代码,它确实运行良好。你用的是哪个php版本?
  • 你能发布一个 $description 的示例值吗?
  • 给你:En je bent overal welkom als je maar Breeddenkend bent!" Tempo (www.temponieuwsbrief.be) mocht op kotbezoek!
  • 您在 PHP 中发现了一个错误,或者您没有正确调试。该文本在 PHP 5.3.3、5.3.6 和 5.3.10 中确实有效。在其文件上运行pastebin.com/YqqQRSnV 的内容,如果可行,请告诉我。
  • 我不是 PHP 人,但我看不出这可能是正则表达式问题。您的替换字符串是静态的,并且其中包含 href,那么正则表达式如何删除它?必须在下游。

标签: php regex url


【解决方案1】:

如果您唯一的问题是链接错误地指向 www.google.com 而不是完全限定的 URL,例如 http://www.google.com,那么正确的替换是:

$description = preg_replace('@(www.([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="http://$1" target="_blank">$1</a>', $description);

【讨论】:

    【解决方案2】:

    &lt;a href="www.example.com"&gt;www.example.com&lt;/a&gt; 在现代浏览器中将无法正常工作,因为 href 值只会附加到当前页面 url,例如http://example.com/www.example.com。您需要指定协议,即。 http/https等

    以下内容将以 ftp、http、https 和文件开头的所有文本“链接”替换为 html a 标签

    <?php
    
        $pattern = '/(www|ftp|http|https|file)(:\/\/)?[\S]+(\b|$)/i';
        $string = 'hello http://example.com https://graph.facebook.com    http://www.example.com www.google.com';
    
        function create_a_tags( $matches ){
    
            $url = $matches[0];
            if ( 'www' == $matches[1] ){
                $url = 'http://' . $matches[0];
            }
            $escaped = htmlspecialchars($matches[0]);
            return sprintf( '<a href="%s">%s</a>', $url, $escaped );
        }
    
        echo preg_replace_callback( $pattern, 'create_a_tags', $string );
    
    ?>
    

    打印

    hello <a href="http://example.com">http://example.com</a>
    <a href="https://graph.facebook.com">https://graph.facebook.com</a>
    <a href="http://www.example.com">http://www.example.com</a>
    <a href="http://www.google.com">www.google.com</a>
    

    【讨论】:

    • 但是如果文本是这样的:www.google.com,我想得到这样的结果:google.com"></a>?
    • 我已经编辑了上面的代码来处理 www url(通过将 http:// 添加到 href 属性)但它现在可能会产生一些误报(我还没有测试过)
    【解决方案3】:

    不久前,我们比较了 URL 验证和识别的不同方法。查看正则表达式的table

    我建议你放弃你的正则表达式并改用gruber revised。 (PHP 5.3)解决方案可能如下所示:

    <?php
    
    $string = 'hello 
    http://example.com 
    https://graph.facebook.com 
    http://www.example.com
    www.google.com
    ftp://example.com';
    
    $string = preg_replace_callback('#(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))#iS', function($m) {
        // use http as default protocol, if none given
        if (strpos($m[0], '://') === false) {
            $m[0] = 'http://' . $m[0];
        }
        // text -> html is a context switch, take care of special characters
        $_m = htmlspecialchars($m[0]);
        return '<a href="' . $_m . '" target="_blank">' . $_m . '</a>';
    }, $string);
    
    echo $string, "\n";
    

    【讨论】:

    • 他目前使用的正则表达式没有任何根本性的错误 - 生成的标记看起来无效(不是 href 上的方案)
    • 我从来没有说过他的正则表达式有什么问题。我只是解释了有一个更好的。此外,此解决方案是唯一一种对用于 HTML 的 URL 进行清理的解决方案。我确实认为值得一提的事情。如果您只想回答核心问题而不看大局 - 成为我的客人并投反对票……
    • 编译不好,我得到这个错误: Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING (on $string = preg_replace_callback('#(?i)\b((?:[a-z][\ w-]+:(?:/{1,3}|[a-z...)
    • rodneyrehm - 有“更大的图景”,然后是误导。
    【解决方案4】:

    我找到了解决方案。它确实与 RegEx 没有任何关系,这是正确的。我的同事在头部添加了这行jquery代码:

    $("a").removeAttr('href');
    

    很明显,href 属性被删除了。我没有看这个,因为我确定这是一个 php/regex 问题。删除它可以解决问题。

    我意识到这是一个愚蠢的错误,你不可能解决这个问题,所以感谢大家的帮助,+1 给你们。

    【讨论】:

      猜你喜欢
      • 2014-04-07
      • 1970-01-01
      • 2013-03-30
      • 2012-01-14
      • 2012-07-12
      • 2014-12-24
      • 2014-05-11
      • 1970-01-01
      • 2010-12-29
      相关资源
      最近更新 更多