PHP preg_replace для всех типов форматов года (ГГГГ, ГГГГ-ГГГГ, ГГГГ - ГГГГ) - PullRequest
0 голосов
/ 18 мая 2018

Попытка просто использовать preg_replace для внесения изменений в строку (добавление html разрыва строки), которая содержит форматы года, такие как 2018 1950-2018 и 1950 - 2018

$j = preg_replace('/([0-9]{4}) - ([0-9]{4})/', '<br>* ${1} - ${2}</strong>', $j);
$j = preg_replace('/([0-9]{4})-([0-9]{4})/', '<br>* ${1} - ${2}', $j);
$j = preg_replace('/\s+(19[5-9][0-9]|20(0[0-9]|10))\s+/', '<br>* ${1} </strong>', $j);

Моим предпочтением будетрегулярное выражение в годах 1950 - 2020

Первые два работают нормально (хотя у меня были проблемы с определением диапазона), но последний перехватывает все экземпляры

как:

* 2007
** 2008 - 2013

и т. Д.

Пробовал использовать ^ и $ для обозначения начала и конца ... но третий всегда совпадает с первыми двумя.

Как я могу полностью разделить эти форматы года, чтобы я мог индивидуально изменить каждый из них по отдельности?

Пример кода:

<?php

$string = 'Detailed Applications: 2005-2006 Volkswagen | 2006 Volkswagen Golf 2.0L 1984CC 121Cu. In. l4 GAS SOHC Naturally Aspirated | 2005 Volkswagen Beetle 2.0L 1984CC 121Cu. In. l4 GAS DOHC Naturally Aspirated | 2005 - 2006 Volkswagen Golf';

echo $string;

echo '<br><br>';

$string = preg_replace('/([0-9]{4}) - ([0-9]{4})/', '<br /><strong>(YYYY - YYYY)* ${1} - ${2}</strong>', $string);
$string = preg_replace('/([0-9]{4})-([0-9]{4})/', '<br /><strong>(YYYY-YYYY)* ${1} - ${2}</strong>', $string);
$string = preg_replace('/(\d19[5-9][0-9]|20[0-9][0-9])(?!\s?-)/', '<br /><strong>(YYYY)* ${1} </strong>', $string);

echo $string;

Выходы

Detailed Applications: 
(YYYY-YYYY)* 2005 - 
(YYYY)* 2006 Volkswagen | 
(YYYY)* 2006 Volkswagen Golf 2.0L 1984CC 121Cu. In. l4 GAS SOHC Naturally Aspirated | 
(YYYY)* 2005 Volkswagen Beetle 2.0L 1984CC 121Cu. In. l4 GAS DOHC Naturally Aspirated | 
(YYYY - YYYY)* 2005 - 
(YYYY)* 2006

Извините, действительно запутался.

По сути, я пытаюсь зациклить его и просто сделать разрыв строки (без разрыва строки) ... очевидно, с моим регулярным выражением он выводит каждый из них на отдельной строке ...

Пытаясь получить такой вывод

Detailed Applications: 
(YYYY-YYYY)* 2005 - 2006 Volkswagen | 
(YYYY)* 2006 Volkswagen Golf 2.0L 1984CC 121Cu. In. l4 GAS SOHC Naturally Aspirated | 
(YYYY)* 2005 Volkswagen Beetle 2.0L 1984CC 121Cu. In. l4 GAS DOHC Naturally Aspirated | 
(YYYY - YYYY)* 2005 - 2006

Bно да .. вот лучшее, что я получил

$j = preg_replace('/([0-9]{4}) - ([0-9]{4})/', '<br /><strong>* ${1} - ${2}</strong>', $j);
$j = preg_replace('/([0-9]{4})-([0-9]{4})/', '<br /><strong>* ${1} - ${2}</strong>', $j);
$j = preg_replace('/(19[5-9][0-9]|20(0[0-9]|20))(?!\s?-)/', '<br /><strong>* ${1} </strong>', $j);

Итак, вот фактическая выдержка из моего сценария

2007 Chevy Silverado Pickup new body style models 2008-2013 Chevy Silverado All Models 2014 Chevy Silverado 2500HD 3500HD 2007 GMC Sierra Pickup new body style models 2008-2013 GMC Sierra All Models 2014 GMC Sierra 2500HD 3500HD 2007-2013 Chevy Tahoe 2007-2013 Chevy Suburban 2007-2013 Chevy Avalanche 2007-2013 GMC Yukon Yukon XL Yukon Denali

Выпрямите все на одну строку (выложил приведенный выше пример сценарияпотому что эта строка не включает YYYY - YYYY вариант ...)

Он выводит вот так

* 2007 Chevy Silverado Pickup new body style models 
* 2008 - 2013 Chevy Silverado All Models 2014 Chevy Silverado 2500HD 3500HD 
* 2007 GMC Sierra Pickup new body style models 
* 2008 - 2013 GMC Sierra All Models 2014 GMC Sierra 2500HD 3500HD 
* 2007 - 2013 Chevy Tahoe 
* 2007 - 2013 Chevy Suburban 
* 2007 - 2013 Chevy Avalanche 
* 2007 - 2013 GMC Yukon Yukon XL Yukon Denali

Все хорошо, кроме * 2008 - 2013 Chevy Silverado All Models 2014 Chevy Silverado 2500HD 3500HD 2014 не разбивается нановая строка ... и я также не могу понять, как сделать диапазон лет (дох!), даже ссылаясь на это регулярное выражение javascript проверки лет в диапазоне

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

preg_replace_callback() позволит вам проверить / извлечь целевые подстроки и сделать условные замены за один проход.

  • A <br> должен быть записан до всех диапазонов года / года, если онэто не самое начало строки.Первая группа захвата - \s*, поэтому она будет захватывать ноль или более пробелов перед целевым диапазоном год / год.Этот элемент всегда будет существовать как [1] в массиве $m.
  • Вторая группа захвата является первым или единственным значением года.Это необходимо для существования функции обратного вызова.Это [2] в массиве $m.
  • Что касается необязательного значения вторичного года, оно должно следовать за нулем или большим количеством пробелов, затем дефисом, а затем нулем или несколькими пробелами.Поскольку нет групп захвата, чтобы следовать за этой группой захвата, php будет генерировать элемент для этой группы, только если он найден - isset() используется, чтобы проверить, существует ли [3].
  • Первоначально я использовал\b, чтобы гарантировать, что значения года не были подстроками больших цифровых подстрок, но формат ваших строк позволяет использовать сопоставление пробелов для подтверждения точного соответствия.

Код: ( Demo ) ( Pattern Demo )

$string = "2007 Chevy Silverado Pickup new body style models 2008-2013 Chevy Silverado All Models 2014 Chevy Silverado 2500HD 3500HD 2007 GMC Sierra Pickup new body style models 2008 - 2013 GMC Sierra All Models 2014 GMC Sierra 2500HD 3500HD 2007-2013 Chevy Tahoe 2007-2013 Chevy Suburban 2007   -   2013 Chevy Avalanche 2007-2013 GMC Yukon Yukon XL Yukon Denali";

echo preg_replace_callback('~(\s*)(19[5-9]\d|20[0-4]\d)(?:\s*-\s*(19[5-9]\d|20[0-4]\d))?(?=\s)~', function($m) {
    //var_export($m);  // un-comment if you want to see each $m array
    //echo "\n---\n";
        return (strlen($m[1]) ? "\n" : "")
                . "<strong>*{$m[2]}"
                . (isset($m[3]) ? " - {$m[3]}" : "")
                . "</strong>";
    },
    $string);

Выход:

<strong>*2007</strong> Chevy Silverado Pickup new body style models
<strong>*2008 - 2013</strong> Chevy Silverado All Models
<strong>*2014</strong> Chevy Silverado 2500HD 3500HD
<strong>*2007</strong> GMC Sierra Pickup new body style models
<strong>*2008 - 2013</strong> GMC Sierra All Models
<strong>*2014</strong> GMC Sierra 2500HD 3500HD
<strong>*2007 - 2013</strong> Chevy Tahoe
<strong>*2007 - 2013</strong> Chevy Suburban
<strong>*2007 - 2013</strong> Chevy Avalanche
<strong>*2007 - 2013</strong> GMC Yukon Yukon XL Yukon Denali
0 голосов
/ 18 мая 2018

Один из способов упростить логику замены - это признать, что вы хотите добавить <br> после каждого четырехзначного года, то есть , а не , за которым следует либо тире, либо пробел и тире.Мы можем легко сформулировать это, используя отрицательный прогноз:

(\d{4})(?!\s?-)

Пример кода:

$input = "that contains year formats like 2018 1950-2018 and 1950 - 2018";
echo preg_replace("/(\d{4})(?!\s?-)/", "$1<br>", $input);

that contains year formats like 2018<br> 1950-2018<br> and 1950 - 2018<br>

Демо

...