首页 > 解决方案 > PHP preg_replace 适用于所有类型的年份格式(YYYY、YYYY-YYYY、YYYY - YYYY)

问题描述

尝试仅使用 preg_replace 对包含年份格式的字符串(添加 html 换行符)进行修改,例如2018 1950-20181950 - 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

ETC

尝试使用^and$来表示开始和结束。但第三个总是与前两个匹配。

我怎样才能完全分离这些年份格式,以便我可以单独更改每个格式?

示例代码:

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

但是是的..这是我得到的最好的

$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没有闯入新行......而且我也无法弄清楚如何做年份范围(doh!)甚至引用这个javascript正则表达式验证范围内的年份

标签: phpregexdatepreg-replacepcre

解决方案


简化替换逻辑的一种方法是识别您希望<br>在每 4 位数年份之后添加一个,其后跟破折号或空格和破折号。我们可以很容易地使用否定的前瞻来表达这一点:

(\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>

演示


推荐阅读