使用 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);
我正在尝试获取 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);