我有一个这样的字符串:
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
开头的网址有人有解决方案吗?
格尔茨,
垫
答案 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);