我真的不知道它们是如何调用的,括号之间的匹配似乎是合法的。无论如何,我已经设置了一个自定义(或不是那么多)标记来保存链接到我的数据库,以便它们更容易获取,它就像[url]http://www.url.com[TextToDisplay]
一样。我现在正在尝试创建一个类似Facebook的算法来检测youtube视频并自动嵌入它们而不是显示链接,但我遇到了这个奇怪的问题。
假设我们将自定义网址标记为:
[url]http://www.youtube.com/watch?v=WEGbZeaMvtg&list=RDproO6qMsR0Y[www.youtube.com]
然后我使用这个preg_replace
preg_replace('/\[url\].*?youtube\.com.*?(v=(.*?)&?)?.*?\[.*?\]/i','[yt]$1[/yt]',$s);
,结果是
[yt][/yt]
原来是
[yt]WEGbZeaMvtg[/yt]
我还尝试了$2
和$0
。 $0
原来是整个字符串,$2
是空的,就像$1
一样。我的问题是为什么那些“正则表达式变量”是空的?
沙箱:http://sandbox.onlinephpfunctions.com/code/e408254542d0bbea2f5635ba2d3c8d3a23f844eb
答案 0 :(得分:2)
preg_replace('/\[url\].*?youtube\.com.*?v=(.*?)[\&|].*?\[.*?\]/is', '[yt]$1[/yt]', $s);
答案 1 :(得分:0)
试试这个。它还提取第二部分(括号中的名称):
preg_replace('/\[url\].*?youtube\.com.*\?v=([^&]*)&[^[]*\[([^]]*)\]/i','[yt]$1 -> $2[/yt]',$str);
观察[^&] *如何表示不包含&
字符的文本块。
答案 2 :(得分:0)
这对我有用:
$str = '[url]http://www.youtube.com/watch?v=WEGbZeaMvtg&list=RDproO6qMsR0Y[www.youtube.com]';
$str = preg_replace('/\[url\].*?youtube\.com.*?v=.*?(.*)\&.*\[www\.youtube\.com\]/i','[yt]$1[/yt]',$str);
echo $str;
答案 3 :(得分:0)
你有多个延迟匹配序列和一些可选部分,所以正则表达式的作用是:
/\[url\].*?youtube\.com.*?(v=(.*?)&?)?.*?\[.*?\]/i
^^^ match as few as possible, done: 0
^ optional, done, skipped
^^^ match as few as possible, done: '/watch?v=WEGbZeaMvtg&list=RDproO6qMsR0Y' will match here
您需要编写正则表达式,以便只有一种可能的解决方案。在你的情况下,你可以使用例如否定的charater类来实现它。