替换和修改具有不同日期/年份的URL

时间:2018-02-21 17:13:50

标签: php regex

我有以下字符串。

$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);
?>

1 个答案:

答案 0 :(得分:0)

通常认为使用解析器(例如DomDocument)会更好,但对于快速和脏的替换,您可以使用

https?://\Qeem.mydomain.com\E/\K\d{4}/\d{2}/([^"'>]*?)\.html

并将其替换为

energy-environment-blog/$1

a demo on regex101.com

<小时/> 更安全的解析器方式看起来像

<?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