0

为什么以下代码不缩短此 URL?为什么不把它变成一个实际的可点击 URL?此功能似乎在除此之外的所有其他情况下都有效。

网址:

strongatheism.net/library/atheology/argument_from_noncognitivism/

代码:

function urlfixer($text){

   $pattern  = '#\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))#';
   $callback = create_function('$matches', '
       $url       = array_shift($matches);      
       $url_parts = parse_url($url);

       $text = parse_url($url, PHP_URL_HOST) . parse_url($url, PHP_URL_PATH);
       $text = preg_replace("/^www./", "", $text);

       $last = -(strlen(strrchr($text, "/"))) + 1;
       if ($last < 0) {
           $text = substr($text, 0, $last) . "&hellip;";
       }

        $url = "http://" . str_replace("http://","",$url);
       return sprintf(\'<a rel="nofollow" target="_blank" href="%s">%s</a>\', $url, $text);
   ');

   return preg_replace_callback($pattern, $callback, $text);
}
4

1 回答 1

0

我有问题要回答您的问题,因为根据您的要求,我会看到两个答案:

  1. 因为正则表达式没有捕获它。
  2. 因为它在函数上下文中不被视为有效 URL。

为了使其正常工作,您需要正确定义 URL 的构成(此处以正则表达式模式的形式),或者您需要在自己的规范中定义它(问题中缺少该规范)。

具有复杂正则表达式的好的代码总是包含正则表达式的确切作用的描述,因为它们往往变得晦涩难懂。这样的注释也可以很好地用作限定有效输入的小规范。代码可能类似于(取自 youtube 视频 ID 的示例):

$pattern = 
    '%^# Match any youtube URL
    (?:https?://)?  # Optional scheme. Either http or https
    (?:www\.)?      # Optional www subdomain
    (?:             # Group host alternatives
      youtu\.be/    # Either youtu.be,
    | youtube\.com  # or youtube.com
      (?:           # Group path alternatives
        /embed/     # Either /embed/
      | /v/         # or /v/
      | /watch\?v=  # or /watch\?v=
      )             # End path alternatives.
    )               # End host alternatives.
    ([\w-]{10,12})  # Allow 10-12 for 11 char youtube id.
    $%x'
    ;

由于您的问题缺乏构成有效 URL 的内容(仍未指定),因此除了添加规范或修复模式(或两者兼而有之)之外,没有什么要回答的了。

然而,第二个问题更容易回答:

为什么不把它变成一个实际的可点击 URL?

因为它没有被捕获。

于 2013-04-10T12:07:11.257 回答