2015-04-08 58 views
0

我試圖使用preg_replace來匹配字符串中的所有youtube鏈接並將其替換爲其他字符。使用preg_replace返回的奇怪字符源自參考

我會匹配[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]標籤,如這一切與他們各自的YouTube ID的比賽:

[youtube]rB2uwRIVo1I[/youtube] 

這也工作正常,但是放置在[youtube]內的文字是一個奇怪的字符,而不是視頻的YouTube管理員ID。

實施例:

enter image description here

我還試圖與\1參考,得到了相同的結果。

我在這裏做錯了什麼?這是一種字符集問題嗎?

回答

2

您需要轉義替換字符串中的反斜槓或使用$n代替。通過嘗試使用\0\1,您將分別插入值爲0和1的字符代碼。另外,既然你想要第一個捕獲組,你想要1,而不是0; 0是整個匹配的字符串。

IOW,改變該:

"[youtube]\0[/youtube]" 

要麼:

"[youtube]\\1[/youtube]" 

或者

"[youtube]$1[/youtube]" 

後者一般是優選的一個。 The documentation包含更多信息。

+0

啊啊謝謝。猜猜我沒有仔細閱讀文檔。 – Brett

2

在替換零件中只使用單引號而不是雙引號。

$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); 
+0

噢好吧......只要你在後者上使用單引號,你可以使用'\\ 1'或'\ 1'。 – Brett

+0

如果你使用單引號,'\ 1'就足夠了。你不需要使用'\\ 1' –