2017-06-23 44 views
-2

我想要一個HTML字符串,並且對於以「_page.php」結尾的字符串中的所有URL進行轉換,以便它們只包含基本名稱和「_page 「因此,例如,以該字符串:使用preg_replace轉換字符串中的URL

<br/>http://www.website.com/folder/A_page.php TEXT 
<br/>http://www.website.com/folder/B_page.php TEXT 
<br/>http://www.website.com/folder/C_page.php TEXT 
<br/>http://www.website.com/folder/D_dont.php TEXT 

我希望它看起來像:

<br/>A_page TEXT 
<br/>B_page TEXT 
<br/>C_page TEXT 
<br/>http://www.website.com/folder/D_dont.php TEXT 

我寫了這個:

$str = preg_replace('!(http)(s)?:\/\/[a-zA-Z0-9.?&_/]+_page.php!', '$0',$str); 

它可以獲得正確數量的匹配,但它將用$ 0替換它們,這是整個匹配的URL,因此根本不會更改URL。這樣做:

$str = preg_replace('!(http)(s)?:\/\/[a-zA-Z0-9.?&_/]+_page.php!', '$1',$str); 

獲取我:

http TEXT 
http TEXT 
http TEXT 
http://www.website.com/folder/D_dont.php TEXT 

所以我想,如果我換了$ 1 $二將返回URL的身體,我可以解析和返回是這樣的:

$str = preg_replace('!(http)(s)?:\/\/[a-zA-Z0-9.?&_/]+_page.php!', basename('$2','.php'),$str); 

$ 2變成空了。我如何捕獲preg_replace中鏈接的主體?

+0

'$ 2'或者是's'或空的,因爲它是什麼'(S)''captures.Use !https?:// [a-zA-Z0-9.?&_/] * /([^ /] * _page)\ .php!'並替換爲$ 1。 –

+0

要使用'basename('$ 2','。php')'或任何函數作爲替換,您需要'preg_replace_callback()'。 – AbraCadaver

回答

1

您不需要所有這些括號。對於這種模式,就像使用它們來捕捉(/.*_page.php)那就是$1

$str = preg_replace('!https?:\/\/[a-zA-Z0-9.?&_/]+(/.*_page.php)!', '$1', $str); 

要在更換使用回調使用的功能。匹配整個URL,然後從在這種情況下是$0$m[0]得到的基本部分:

$str = preg_replace_callback('!https?:\/\/[a-zA-Z0-9.?&_/]+_page.php!', 
          function($m) { return basename($m[0]); }, 
          $str); 
+0

謝謝!你解釋得很好。 –