正则表达式变量丢失。

3
我不太清楚它们被称为什么,但括号中的变量看起来很合法。无论如何,我已经设置了一个自定义(或不太自定义)标记,以便将链接保存到我的数据库中,以便更容易提取,它看起来像这样:[url]http://www.url.com[TextToDisplay]。现在我正在尝试创建一个类似Facebook的算法,它会自动检测YouTube视频并嵌入它们,而不是显示链接,但我遇到了这个奇怪的问题。
假设我们有以下自定义URL标记: [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


我相信“括号之间的匹配”被称为捕获。 - shennan
@shennan 收到了这个通知。 - php_nub_qq
2
你真的需要将v=部分设置为可选吗?如果你强制要求v=位存在,这很容易做到。- 就像所有答案所示 - OGHaza
@OGHaza,这正是我刚刚注意到并想着自己:难道我很蠢吗... / 手掌捂脸 - php_nub_qq
@php_nub_qq,提醒一下,如果你在(v=(.*?)&?)?中删除问号并从$2获取值,则你的原始代码可以正常工作。 - OGHaza
4个回答

2
preg_replace('/\[url\].*?youtube\.com.*?v=(.*?)[\&|].*?\[.*?\]/is', '[yt]$1[/yt]', $s);

嘿,你能解释一下 [\&|] 这个正则表达式的确切作用吗?因为我在尝试匹配一个字符串中的两个链接以及一个没有 & 的 URL 时遇到了问题 :/ - php_nub_qq

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

你需要编写正则表达式,以便只有一种可能的解决方案。在你的情况下,你可以使用否定字符类来实现这一点。

为了说明


0

试试这个。它还提取第二部分(括号中的名称):

preg_replace('/\[url\].*?youtube\.com.*\?v=([^&]*)&[^[]*\[([^]]*)\]/i','[yt]$1 -> $2[/yt]',$str);

观察一下 [^&]* 表示的是一个不包含 & 字符的文本块。

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接