PHP正则表达式错误不尊重换行符

时间:2015-10-20 20:59:50

标签: php regex

好的,所以我有一些奇怪的边缘案例错误,我似乎无法压制。

我有一个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;
}

0 个答案:

没有答案