【问题标题】:StackOverflow Style A Href Auto Linking in Regex正则表达式中的 StackOverflow 样式 A Href 自动链接
【发布时间】:2011-08-23 17:09:26
【问题描述】:

我正在使用 below 功能来搜索文本链接并将它们转换为超链接。首先它是否正确?它似乎可以工作,但您知道会破坏此功能的(可能是格式错误的)网址吗?

我的问题是是否有可能让它也支持端口号,例如 stackoverflow.com:80/index 不会被转换,因为端口不被视为 url 的有效部分。

所以总而言之,我正在寻找 Stackoverflow 风格的 url 识别,我相信这是对 Markdown 的自定义添加。

  /**
   * Search for and create links from urls
   */
  static public function autoLink($text) {
    $pattern = "/(((http[s]?:\/\/)|(www\.))(([a-z][-a-z0-9]+\.)?[a-z][-a-z0-9]+\.[a-z]+(\.[a-z]{2,2})?)\/?[a-z0-9._\/~#&=;%+?-]+[a-z0-9\/#=?]{1,1})/is";
    $text = preg_replace($pattern, " <a href='$1'>$1</a>", $text);
    // fix URLs without protocols
    $text = preg_replace("/href='www/", "href='http://www", $text);

    return $text;
  } 

感谢您的宝贵时间,

【问题讨论】:

  • 您的函数不适用于指向子域的 URL(例如 my.domain.com/mypage
  • 您希望事情有多准确? www.ca 完全有效的网址,但不是您希望经常看到的网址。有很多东西是主机名,但绝对不像一个。
  • 理想情况下涵盖所有可能性,但我怀疑有人会指向像 www.ca 这样的网址,看看堆栈溢出的工作原理会很有趣,它看起来非常好!
  • @Pez:Stack Overflow 使用 MarkdownSharp 和“Stack Exchange 添加”:stackoverflow.com/editing-help。对于 PHP,原 Markdown 项目推荐 Michel Fortin 的 PHP Markdown 端口。

标签: php regex


【解决方案1】:

你也应该看看这个问题的答案:How to mimic StackOverflow Auto-Link Behavior


我最终结合了堆栈溢出和与同事交谈时得到的答案。下面的代码是我们能想到的最好的代码。

/**
   * Search for and create links from urls
   */
  static public function autoLink($text) {
    $pattern = "/\b((?P<protocol>(https?)|(ftp)):\/\/)?(?P<domain>[-A-Z0-9\\.]+)[.][A-Z]{2,7}(([:])?([0-9]+)?)(?P<file>\/[-A-Z0-9+&@#\/%=~_|!:,\\.;]*)?(?P<parameters>\?[A-Z0-9+&@#\/%=~_|!:,\\.;]*)?/ise";
$text = preg_replace($pattern, "' <a href=\"'.htmlspecialchars('$0').'\">$0</a>'", $text);

    // fix URLs without protocols
    $text = preg_replace("#href='www#i", "href='http://www", $text);
    $text = preg_replace("#href=['\"](?!(https?|ftp)://)#i", "href='http://", $text);

    return $text;
  } 

【讨论】:

  • 这个函数在没有协议的情况下搞砸了你的 html:一个简单的链接像 www.google.com 和 info@google.com 被转换成错误的 html 代码。
  • 在最终版本中,我进行了一些检查以防止这种情况发生。不幸的是,我不再拥有访问权限。
【解决方案2】:

与其编写自己的自动链接例程(本质上是自定义标记引擎的开始),不如使用开源标记引擎,因为它不太可能受到跨站点脚本攻击。用于 PHP 的开源标记引擎的一个示例是 PHP Markdown,它能够自动链接 URL,并且基本上使用与 StackOverflow 相同的 Markdown 语法。

注意:在将文本粘贴到属性或元素的内部文本之前,您应该始终使用 htmlspecialchars() 转义 HTML 特殊字符。

【讨论】:

    【解决方案3】:
    $pattern = "/\b(?P<protocol>https?|ftp):\/\/(?P<domain>[-A-Z0-9.]+)(([:])?([0-9]+)?)(?P<file>\/[-A-Z0-9+&@#\/%=~_|!:,.;]*)?(?P<parameters>\?[A-Z0-9+&@#\/%=~_|!:,.;]*)?/i";
    

    将匹配:

    http://www.scoogle.org/index.html

    http://www.scoogle.org:80/index.html?source=library

    【讨论】:

      猜你喜欢
      • 2012-06-08
      • 2013-04-02
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      • 2012-12-01
      • 1970-01-01
      相关资源
      最近更新 更多