获取来自引用的 preg_replace 返回的奇怪字符

Getting strange character returned with preg_replace originating from reference

我正在尝试使用 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][=13=][/youtube]", $data);

echo $data;

现在,我正在尝试用 [youtube] 标签中的相应 YouTube ID 替换所有匹配项,如下所示:

[youtube]rB2uwRIVo1I[/youtube]

这也可以正常工作,但是 [youtube] 中的文本是一个奇怪的字符,而不是视频的 YouTube ID。

示例:

我也尝试了 参考并得到了相同的结果。

我在这里做错了什么?这是某种字符集问题吗?

您需要转义替换字符串中的反斜杠或改用 $n。通过尝试使用 [=14=]</code>,您将分别插入值为 0 和 1 的字符代码。此外,由于您想要第一个捕获组,所以您想要 1,而不是 0; 0 是整个匹配的字符串。</p> <p>IOW,改变这个:</p> <pre><code>"[youtube][=10=][/youtube]"

至:

"[youtube]\1[/youtube]"

"[youtube][/youtube]"

后者通常是首选。 The documentation 包含更多信息。

只需在替换部分使用单引号而不是双引号即可。

$data = preg_replace('#(?:(?:\[youtube\])\s*)?(?:https?://)?(?:www\.)?(?:youtube\.com)/watch\?[^\s]*v=([a-zA-Z0-9_-]+)[^\s]*(?:\s*(?:\[/youtube\]))?#im', '[youtube][=10=][/youtube]', $data);

看来您需要在替换部分使用 </code> 才能获得所需的输出。</p> <pre><code>$data = preg_replace('#(?:(?:\[youtube\])\s*)?(?:https?://)?(?:www\.)?(?:youtube\.com)/watch\?[^\s]*v=([a-zA-Z0-9_-]+)[^\s]*(?:\s*(?:\[/youtube\]))?#im', '[youtube][/youtube]', $data);