针对不同URL的多个preg_replace RegEx

时间:2014-03-23 13:13:46

标签: regex wordpress preg-replace

我有一个这样的字符串:

Blablabla http://www.soundcloud.com/artist/track
www.facebook.com/page is my page
Try www.youtube.com/watch?v=1234567 for my video
Check http://www.somesite.com/bla.

我想替换网址并在用户生成的帖子中插入不同的wordpress短代码,自动与视频或soundcloud小部件交换网址,并创建来自所有其他网址和电子邮件的常规链接,如下所示(简化):

Blablabla [soundcloud]www.soundcloud.com/artist/track[/soundcloud]
[facebook]www.facebook.com/page[/facebook] is my page
Try [youtube]www.youtube.com/watch?v=1234567[/youtube] for my video
Check [url]www.somesite.com/bla[/url].

所以我认为我需要在字符串上运行几个preg_replace操作。

在我用Wordpress短代码替换Soundcloud,Facebook和Youtube网址后,我需要在http://www.somesite.com/bla之类的剩余网址上运行preg_replace,但由于Facebook / Soundcloud / Youtube模式仍然在字符串中可用(现在在里面)短信)他们将再次被替换成......

[youtube][url]www.youtube.com/watch?v=1234567[/url][/youtube]

我不想要这种行为。我应该是这样的:

[url]www.youtube.com/watch?v=1234567[/url]

这是我的基本RegEx:

((https?://)(www。)|(https?://)|(www。))[^<] +

我需要替换以http,https和www

开头的网址

有人有解决方案吗?

格尔茨,

1 个答案:

答案 0 :(得分:1)

我建议你改为查看preg_replace_callback函数。

不是尝试匹配不同网址的不同子集,而是为了匹配它们!然后,在代码中检查特定的捕获组以检查URL的基础

所以,在php代码中,如果url以facebook开头,请用facebook短代码替换url,依此类推。

这是你的正则表达式,经过轻微修改以捕获域名。记得逃避你的文字时期。这只会捕获域的第一个< / ?或空格,然后直到第一个<或其余网址的空白。如果您发现任何不适用的内容,则可能需要修改此内容。

((https?://)(www\.)|(https?://)|(www\.))([^</\?\s]+)[^<\s]*

现在有些PHP代码。回想$ match [0]将具有完全匹配,$ matches [6]将具有第6个捕获组 - 在这种情况下为([^</\?\s]+),域部分

$post = preg_replace_callback(
    '/((https?:\/\/)(www\.)|(https?:\/\/)|(www\.))([^<\/\?\s]+)[^<\s]*/',
    function ($matches) {
        switch($matches[6]){
            case 'facebook.com':
                return "[facebook]" . $matches[0] . "[/facebook]";

            case 'youtube.com':
                return "[youtube]" . $matches[0] . "[/youtube]";

            case 'soundcloud.com':
                return "[soundcloud]" . $matches[0] . "[/soundcloud]";

            default:
                return "[url]" . $matches[0] . "[/url]";
        }
    },
    $post);