好的,所以我有一些奇怪的边缘案例错误,我似乎无法压制。
我有一个textarea表单输入,用户可以在其中键入状态更新。我已经构建了一个方法来解析这个并自动链接http-links(除了我使用Essence库做一些oEmbed魔法的几个域)。
但是在一个非常具体的边缘案例中,autolink完成了错误。
具体来说,当有一个子目录的url,没有结束斜杠时,在url之后,用户立即返回一个新行并继续输入。 发生这种情况时,新行的第一个单词将包含在匹配的网址中。
该功能如下所示:
function autolink( $text, $attributes=array() ) {
$regex = "/(http|https)\:\/\/[a-z0-9\-\.]+\.[a-z0-9]{2,99}(\/\S*)?/i";
$urls = array();
if( preg_match_all( $regex, $text, $urls, PREG_PATTERN_ORDER ) ) {
foreach($urls[0] as $url) {
$parsed_url = parse_url($url);
if( in_array( $parsed_url['host'], array( 'youtube.com', 'vimeo.com', 'soundcloud.com', 'www.youtube.com', 'www.vimeo.com', 'www.soundcloud.com' ) ) ) {
$essence = Essence\Essence::instance();
$media = $essence->embed( $url );
$text = str_replace($url, '<div class="embed-container">'.$media->html.'</div>', $text);
} else {
$attrs = '';
foreach( $attributes as $attribute => $value ) {
$attrs .= " {$attribute}=\"{$value}\"";
}
$text = str_replace($url,'<a href="'.$url.'"'.$attrs.'>'.$url.'</a>', $text);
}
}
}
$text = '<pre>'.print_r($urls, true).'</pre>'.$text;
$text = trim( $text );
return $text;
}