为什么下面的代码没有缩短这个URL?为什么不把它变成可点击的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) . "…";
}
$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);
}
我有问题要回答你的问题,因为根据你的要求,我看到两个答案:
- 因为正则表达式没有捕获它。
- 因为在函数的上下文中它不被认为是一个有效的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?
因为没有被捕获