Заменить окончание случайным и добавить символы с регулярным - PullRequest
0 голосов
/ 24 марта 2019

У меня есть список URL с произвольно заканчивающейся строкой, такой как:

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, работающего на MySQL 5, PHP 7 и Apache 2

Ответы [ 2 ]

1 голос
/ 24 марта 2019

Вы можете захватить в группе то, что предшествует шаблону, который вы хотите сопоставить и удалить.Затем при замене используйте первую группу захвата:

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

Это будет соответствовать:

  • ^ Начало строки
  • (.*) Захват вгруппа, соответствующая любому символу 0+ раз
  • -[a-f0-9]+ Совпадение с дефисом, затем 1+ раз 0-9 или af
  • (?:-[a-f0-9]+){4,5} Повторите 4-5 раз, сопоставляя дефис с последующим 1+ раз0-9 или af
  • $ Конец строки

Заменить на косую черту и группу захвата 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
0 голосов
/ 24 марта 2019

Значит, все эти строки имеют одинаковый формат?

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...