正则表达式变量丢失

时间:2013-11-16 12:51:38

标签: php regex

我真的不知道它们是如何调用的,括号之间的匹配似乎是合法的。无论如何,我已经设置了一个自定义(或不​​是那么多)标记来保存链接到我的数据库,以便它们更容易获取,它就像[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

4 个答案:

答案 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类来实现它。

To illustrate