使用preg_replace转换字符串中的URL

时间:2017-06-23 16:56:29

标签: php regex preg-replace

我正在尝试使用一串HTML,并且对于字符串中以" _page.php"结尾的所有网址; &安培;转换它们,使它们只包含基本名称和" _page"例如,使用此字符串:

<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切换到$ 2,它将返回我可以解析的URL的主体并返回如下:

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

$ 2虽然空了。如何在preg_replace中捕获链接的主体?

1 个答案:

答案 0 :(得分:1)

你不需要所有这些括号。对于此模式,只需使用它们来捕获(/.*_page.php),即$1

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

要在替换中使用函数,请使用回调。匹配整个网址,然后从$0$m[0]中获取基本名称:

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