我在一块文本上执行preg_match_all
和str_replace
,以获取YouTube网址并将其替换为正确的嵌入代码。
假设我有以下文本块:
"bla bla bla bla <-youtube-url-> last few words"
一切正常-将youtube-url替换为嵌入代码等。但是,运行str_replace后,“最后几个单词”将从最终输出中消失。我怀疑正则表达式会吞下网址后的所有内容...这就是我用来匹配和提取YouTube ID的内容:
%(?:youtube\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i
任何帮助将不胜感激!
更新:
我刚刚发现,仅当youtube网址具有任何尾随参数时,才会发生此问题。以下输入将的最后几个单词吞下:
'www.youtube.com/watch?v=XXXXXXXXX¶meter=data last few words'
但是,如果输入是这样的:
'www.youtube.com/watch?v=XXXXXXXXX last few words'
它工作正常。任何人都可以为正则表达式进行必要的调整吗?
最佳答案
我通常会分解一些复杂的变化,以找出发生了什么情况。
看来您可能对最后一个词[^"&?/ ]{11}
有兴趣,但是不确定
您正在尝试做什么。 (下面是在Perl中)
$samp = 'www.youtube.com/watch?v=XXXXXXXXX¶meter=data last few words';
$regex = qr%
(?:
youtube\.com/
(?:
( [^/]+/.+/ ) # 1
|
( # 2
v
| e(?:mbed)?/
)
|
( .*[?&]v= ) # 3
)
|
( youtu\.be/ ) #4
)
( [^"&?/ ]{1,11} ) # 5, was {11}
(.*)$ # 6 the remainder
%xi;
if ( $samp =~ /$regex/ )
{
# just print what matched
print "all: '$&' \n";
print "1: '$1' \n";
print "2: '$2' \n";
print "3: '$3' \n";
print "4: '$4' \n";
print "5: '$5' \n";
print "6: '$6' \n";
}
输出:
all: 'youtube.com/watch?v=XXXXXXXXX¶meter=data last few words'
1: ''
2: ''
3: 'watch?v='
4: ''
5: 'XXXXXXXXX'
6: '¶meter=data last few words'
关于php - youtube正则表达式会吞下剩余的文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7477456/