获取来自引用的 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);
我正在尝试使用 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);