我正在尝试使用一串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中捕获链接的主体?
答案 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);