我试图用preg_replace来匹配所有的youtube链接,并将它们替换为其他链接。
我将匹配标准链接和[youtube][/youtube]标签中的完整链接。
将匹配的内容示例:
https://www.youtube.com/watch?v=rB2uwRIVo1I&foo=jpiadSpjpj&moo=foo&cow=123
https://www.youtube.com/watch?v=rB2uwRIVo1I&foo=jpiadSpjpj&moo=foo&cow=123
[youtube]https://www.youtube.com/watch?v=rB2uwRIVo1I&foo=jpiadSpjpj&moo=foo&cow=123[/youtube]
[youtube]https://www.youtube.com/watch?v=rB2uwRIVo1I&foo=jpiadSpjpj&moo=foo&cow=123[/youtube]与之不匹配的例子:
[youtube]rB2uwRIVo1I[/youtube]现在,在用preg_match进行测试时,所有这些都很好;我用以下代码测试了preg_replace:
$data = file_get_contents('data-all.txt');
$data = preg_replace('#(?:(?:\[youtube\])\s*)?(?:https?://)?(?:www\.)?(?:youtube\.com)/watch\?[^\s]*v=([a-zA-Z0-9_-]+)[^\s]*(?:\s*(?:\[/youtube\]))?#im', "[youtube]\0[/youtube]", $data);
echo $data;现在,我试图用它们各自的youtube ID替换所有匹配的[youtube]标记,如下所示:
[youtube]rB2uwRIVo1I[/youtube]这也很好,但是放置在[youtube]中的文本是一个奇怪的字符,而不是视频的youtube ID。
示例:

我还尝试使用\1引用并得到了相同的结果。
我在这里做错什么了?这是某种字符集的问题吗?
发布于 2015-04-08 15:24:02
您需要在替换字符串中转义反斜杠,或者使用$n。通过尝试使用\0和\1,您将插入值分别为0和1的字符代码。另外,由于您想要第一个捕获组,所以需要1,而不是0;0是整个匹配的字符串。
IOW,改变这一点:
"[youtube]\0[/youtube]"以下列方式之一:
"[youtube]\\1[/youtube]"或
"[youtube]$1[/youtube]"后者通常是首选的。文献资料包含更多信息。
发布于 2015-04-08 15:28:01
只需在替换部分中使用单引号而不是双引号。
$data = preg_replace('#(?:(?:\[youtube\])\s*)?(?:https?://)?(?:www\.)?(?:youtube\.com)/watch\?[^\s]*v=([a-zA-Z0-9_-]+)[^\s]*(?:\s*(?:\[/youtube\]))?#im', '[youtube]\0[/youtube]', $data);似乎您需要在替换部分中使用\1来获得所需的输出。
$data = preg_replace('#(?:(?:\[youtube\])\s*)?(?:https?://)?(?:www\.)?(?:youtube\.com)/watch\?[^\s]*v=([a-zA-Z0-9_-]+)[^\s]*(?:\s*(?:\[/youtube\]))?#im', '[youtube]\1[/youtube]', $data);https://stackoverflow.com/questions/29518738
复制相似问题