【问题标题】:Multiple preg_replace RegEx for different URLs不同 URL 的多个 preg_replace 正则表达式
【发布时间】:2014-03-23 13:13:45
【问题描述】:

我有一个这样的字符串:

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.

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

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 URL 后,我需要在剩余的 URL 上运行 preg_replace,例如 http://www.somesite.com/bla,但由于字符串中仍然可以使用 Facebook/Soundcloud/Youtube 模式(现在在短代码中) 它们将再次被替换为...

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

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

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

这是我的基本正则表达式:

((https?://)(www.)|(https?://)|(www.))[^

我需要替换以 http、https 和 www 开头的 URL

有人有解决办法吗?

问候,

垫子

【问题讨论】:

    标签: regex wordpress preg-replace


    【解决方案1】:

    我建议您改用 preg_replace_callback 函数。

    对于每个不同的站点,与其尝试匹配不同的 url 子集,不如将它们全部匹配!然后,在代码中检查特定的捕获组以检查 url 的基础

    因此,在 php 代码中,如果 url 以 facebook 开头,则将 url 替换为 facebook 短代码,依此类推。

    这是您的正则表达式,稍作修改以捕获域。记住要避开你的字面意思。这只会捕获第一个 < / ? 或域的空格,然后直到第一个 < 或 URL 其余部分的空格。如果您发现这不起作用,您可能需要修改它。

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

    现在是一些 php 代码。回想一下,$matches[0] 将具有完整匹配,而 $matches[6] 将具有第 6 个捕获组 - 在本例中为 ([^&lt;/\?\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);
    

    【讨论】:

    • 太棒了。作品!非常感谢 :-) 我所做的唯一更改是在 switch 命令的默认返回中使用 [url]。
    • 哦,对了。我的错。我的也是固定的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 2011-03-10
    • 2011-05-20
    • 2016-07-11
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多