2017-06-23 35 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

谢谢!你解释得很好。 –