替换随机结尾,并用正则表达式添加字符

时间:2019-03-24 10:26:15

标签: regex

我有一个带有随机结尾字符串的网址列表,如下所示:

paris-chambre-double-classique-avec-option-petit-dejeuner-a-lhotel-trianon-rive-gauche-4-pour-2-personnes-8ae0676c-aba2-4cf2-9391-91096a247672

paris-chambre-double-standard-avec-petit-dejeuner-et-acces-spa-pour-2-personnes-a-lhotel-le-mareuil-4-f707b0fe-31cb-4507-b7b3-7b91695bff9c 

现在,过去几天来我一直在尝试找到一个正则表达式来将该行转换为:

/paris-chambre-double-classique-avec-option-petit-dejeuner-a-lhotel-trianon-rive-gauche-4-pour-2-personnes.html

/paris-chambre-double-standard-avec-petit-dejeuner-et-acces-spa-pour-2-personnes-a-lhotel-le-mareuil-4-f707b0fe-31cb-4507-b7b3-7b91695bff9c.html

问题是随机字符串:

3d0b087-5701-4199-9d9c-147cca687263
33d0b087-5701-4199-9d9c-147cca687263

我需要在没有最后一个的情况下删除此部分-并添加.html:在url之前添加斜杠,例如:

我不要这个:

/paris-chambre-doubletriplequadruple-confort-avec-petit-dejeuner-a-lhotel-de-france-gare-de-lyon-pour-2-a-4-pers-.html

但是这个:

/paris-chambre-doubletriplequadruple-confort-avec-petit-dejeuner-a-lhotel-de-france-gare-de-lyon-pour-2-a-4-pers.html

这是用于运行Linux 5,PHP 7和Apache 2的新Linux服务器

3 个答案:

答案 0 :(得分:1)

您可以在组中捕获要匹配和删除的模式之前的内容。然后在替换中使用第一个捕获组:

^(.*)-[a-f0-9]+(?:-[a-f0-9]+){4,5}$

这将匹配:

  • ^字符串的开头
  • (.*)捕获匹配0次以上任何字符的组
  • -[a-f0-9]+匹配连字符,后跟1+次0-9或a-f
  • (?:-[a-f0-9]+){4,5}重复4-5次与连字符匹配,然后是1+次0-9或a-f
  • $字符串结尾

替换为正斜杠并捕获组1,后跟.html

/$1.html

Regex demo | php demo

例如

$strings = [
    "paris-chambre-double-classique-avec-option-petit-dejeuner-a-lhotel-trianon-rive-gauche-4-pour-2-personnes-8ae0676c-aba2-4cf2-9391-91096a247672",
    "paris-chambre-double-standard-avec-petit-dejeuner-et-acces-spa-pour-2-personnes-a-lhotel-le-mareuil-4-f707b0fe-31cb-4507-b7b3-7b91695bff9c"
];

foreach ($strings as $string){
    echo preg_replace('/^(.*)-[a-f0-9]+(?:-[a-f0-9]+){4,5}$/', '/$1.html', $string) . PHP_EOL;
}

结果:

/paris-chambre-double-classique-avec-option-petit-dejeuner-a-lhotel-trianon-rive-gauche-4-pour-2-personnes.html
/paris-chambre-double-standard-avec-petit-dejeuner-et-acces-spa-pour-2-personnes-a-lhotel-le-mareuil-4.html

答案 1 :(得分:0)

那么这些字符串都是相同的格式吗?

8-4-4-4-12个字母数字字符

那么正则表达式可能是:

/-\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$/

({\w等同于[a-zA-Z0-9]。)

在PHP中,您将执行以下操作:

$input = "paris-chambre-double-classique-avec-option-petit-dejeuner-a-lhotel-trianon-rive-gauche-4-pour-2-personnes-8ae0676c-aba2-4cf2-9391-91096a247672";
$str = preg_replace("/-\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$/", "$1.html", $input);

答案 2 :(得分:0)

由于您的注释似乎表明唯一的标识子字符串可以在字符串的开头或结尾,所以我建议不要将.html应用于替换-只需将其串联/附加到经过清理的字符串。

使前导/后跟连字符为可选,以提高灵活性。

代码:(Demo

$strings = [
    "paris-chambre-double-classique-avec-option-petit-dejeuner-a-lhotel-trianon-rive-gauche-4-pour-2-personnes-8ae0676c-aba2-4cf2-9391-91096a247672",
    "f707b0fe-31cb-4507-b7b3-7b91695bff9c-paris-chambre-double-standard-avec-petit-dejeuner-et-acces-spa-pour-2-personnes-a-lhotel-le-mareuil-4"
];

foreach ($strings as $string) {
    echo preg_replace(
             '/-?[a-f\d]{8}-[a-f\d]{4}-[a-f\d]{4}-[a-f\d]{4}-[a-f\d]{12}-?/',
             '',
             $string
         ) . '.html';
    echo "\n---\n";
}

输出:

paris-chambre-double-classique-avec-option-petit-dejeuner-a-lhotel-trianon-rive-gauche-4-pour-2-personnes.html
---
paris-chambre-double-standard-avec-petit-dejeuner-et-acces-spa-pour-2-personnes-a-lhotel-le-mareuil-4.html
---