我有以下字符串。
$string = 'Hello there how are <a
href="http://eem.mydomain.com/2015/06/court-compels-epa-to-
respond.html">some link name</a> there how are there how are
<a href="http://eem.mydomain.com/2014/03/wv-clean-air-act-case.html">another
link name</a> ';
我需要一个PHP函数,它将字符串中的URL转换为以下URL。
$new_string = 'Hello there how are <a href="http://eem.mydomain.com/energy-
environment-blog/court-compels-epa-to-respond">some link name</a> there how
are there how are
<a href="http://eem.mydomain.com/energy-environment-blog/wv-clean-air-act-
case">another link name</a> ';
在新网址中,年份和月份需要替换为&#39; energy-environment-blog&#39;并且需要删除.html扩展名。任何人都可以帮助编写一个模式,该模式将匹配URL中的不同年份/日期并删除.html扩展名。那部分让我沮丧。
<?php
$pattern = "";
$replacement = '';
$new_string = preg_replace($pattern, $replacement, $string);
?>
答案 0 :(得分:0)
通常认为使用解析器(例如DomDocument
)会更好,但对于快速和脏的替换,您可以使用
https?://\Qeem.mydomain.com\E/\K\d{4}/\d{2}/([^"'>]*?)\.html
并将其替换为
energy-environment-blog/$1
<小时/>
更安全的解析器方式看起来像
<?php
$string = 'Hello there how are <a
href="http://eem.mydomain.com/2015/06/court-compels-epa-to-
respond.html">some link name</a> there how are there how are
<a href="http://eem.mydomain.com/2014/03/wv-clean-air-act-case.html">another
link name</a> ';
$dom = new DomDocument();
$dom->loadHTML($string);
$xpath = new DomXPath($dom);
$regex = '~https?://\Qeem.mydomain.com\E/\K\d{4}/\d{2}/([^"\'>]*?)\.html~';
$replacement = 'energy-environment-blog/$1';
foreach ($xpath->query("//a[contains(@href, 'eem.mydomain.com')]") as $link){
$link->setAttribute('href', preg_replace($regex, $replacement, $link->getAttribute('href')));
}
print_r($dom->saveHTML());
?>
使用第一种方法,您将在字符串上执行替换,而使用第二种方法,您将在属性上执行替换。在这种情况下,差异可能看起来微妙,但肯定更安全 如需进一步参考,请查看the most famous SO answer。