使用 preg_replace 转换字符串中的 URL

Using preg_replace to transform URLs in a string

我正在尝试获取 HTML 的字符串,并且对于字符串中以“_page.php”结尾的所有 URL 并转换它们,以便它们仅包含基本名称和“_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!', '[=13=]',$str);

它获得了正确数量的匹配项,但它用 $0 替换它们,这是整个匹配的 URL 所以它根本不会改变 URL。这样做:

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

得到我:

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

所以我想如果我将 $1 切换为 $2 它会 return 我可以解析的 URL 的正文并且 return 像这样:

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

$2 结果是空的。如何在 preg_replace 中捕获 link 的正文?

您不需要所有这些括号。对于此模式,只需使用它们来捕获 (/.*_page.php),即 </code>:</p> <pre><code>$str = preg_replace('!https?:\/\/[a-zA-Z0-9.?&_/]+(/.*_page.php)!', '', $str);

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

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