php条件preg_replace

时间:2016-07-08 21:39:49

标签: php regex preg-replace

我找到了一个正则表达式样本,对我来说很有用。现在我需要修改它,但我在正则表达式上非常糟糕。我搜索谷歌并尝试了一些但我失败了。

这里是我发现的正则表达式:

            $parsedMessage =
            preg_replace(
                array(
                    '/(?i)\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))/',
                    '/(^|[^a-z0-9_])@([a-z0-9_]+)/i', '/(^|[^a-z0-9_])#([a-z0-9şŞıİçÇöÖüÜĞğ_]+)/i'),
                array(
                    '<a href="$1" target="_blank">$1</a>',
                    '$1<a href="/$2">@$2</a>',
                    '$1<a href="/hashtag/$2">#$2</a>'),
                $message);

它返回$ message,替换为#hashtags,@ mentions和普通链接,现在我想添加这个(也找到它),

    return preg_replace(
    '/\s*[a-zA-Z\/\/:\.]*youtu(be.com\/watch\?v=|.be\/)([a-zA-Z0-9\-_]+)([a-zA-Z0-9\/\*\-\_\?\&\;\%\=\.]*)/i',
    "<iframe src=\"//www.youtube.com/embed/$2\" type=\"text/html\" width=\"480\" height=\"270\" allowfullscreen></iframe>",
    $string
);

就像你得到它一样,它将替换的youtube链接替换为嵌入代码。如果我这样使用它:

$parsedMessage =
        preg_replace(
            array('/\s*[a-zA-Z\/\/:\.]*youtu(be.com\/watch\?v=|.be\/)([a-zA-Z0-9\-_]+)([a-zA-Z0-9\/\*\-\_\?\&\;\%\=\.]*)/i',
                '/(?i)\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))/',
                '/(^|[^a-z0-9_])@([a-z0-9_]+)/i', '/(^|[^a-z0-9_])#([a-z0-9şŞıİçÇöÖüÜĞğ_]+)/i'),
            array('<iframe src=\"//www.youtube.com/embed/$2\" type=\"text/html\" width=\"480\" height=\"270\" allowfullscreen></iframe>',
                '<a href="$1" target="_blank">$1</a>',
                '$1<a href="/$2">@$2</a>',
                '$1<a href="/hashtag/$2">#$2</a>'),
            $message);

返回

但这不是我想要的。这就是我需要的:

如果$ message包含youtube链接,请将链接替换为embed并继续替换tag.Else的常规链接,只需将普通链接替换为

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。如果您需要,您可以使用它:) Get it on github gist.

这里$ message是一个将被替换的文本。 (#hastags @mentions和http://youtube.com?v=blabla被替换)

User :: where('username',$ m [2]) - &gt; exists()是laravel的一部分,你可以评论这个条件

$ parsedMessage3被替换为文本。请注意,只允许使用一个YouTube链接。

    function convert_clickable_links($message)
{

    global $youtube_link;
    global $count;

    $parsedMessage1 = preg_replace_callback(
        '/(?i)\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))/',
        function ($m) use($youtube_link,$count)
        {
            $matches=[];

            $match_bool=preg_match
            (
                '/\s*[a-zA-Z\/\/:\.]*youtu(be.com\/watch\?v=|.be\/)([a-zA-Z0-9\-_]+)([a-zA-Z0-9\/\*\-\_\?\&\;\%\=\.]*)/i',
                $m[0],
                $matches
            );

            if($match_bool)
            {
                global $youtube_link;
                global $count;
                if($count>1)
                {
                    return '<a href="'.$m[1].'" target="_blank">'.$m[1].'</a>';
                }
                else
                {
                    $youtube_link='<iframe src="//www.youtube.com/embed/'.$matches[2].'" type="text/html" width="100%" height="270" allowfullscreen></iframe>';
                }
                ++$count;
                return  '';
            }
            else
            {
                return '<a href="'.$m[1].'" target="_blank">'.$m[1].'</a>';
            }
        },
        $message,-1,$count);

    $parsedMessage1=$parsedMessage1.$youtube_link;

    $parsedMessage2= preg_replace_callback(

        '/(^|[^a-z0-9_])@([a-z0-9_]+)/i',
        function ($m) {
            if (User::where('username', $m[2])->exists())
            {
                return $m[1].'<a href="/'.$m[2].'">@'.$m[2].'</a>';
            }
            else
            {
                return ' @'.$m[2];
            }
        },
        $parsedMessage1);

    $parsedMessage3=preg_replace('/(^|[^a-z0-9_])#([a-z0-9şŞıİçÇöÖüÜĞğ_]+)/i','$1<a href="/hashtag/$2">#$2</a>',$parsedMessage2);


    return $parsedMessage3;

}