php - PHP preg_replace 适用于所有类型的年份格式(YYYY、YYYY-YYYY、YYYY - YYYY)
问题描述
尝试仅使用 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
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正则表达式验证范围内的年份
解决方案
简化替换逻辑的一种方法是识别您希望<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>
演示
推荐阅读
- ssl-certificate - 邮递员 Mac 中的 SSL 证书验证失败
- bash - 通过仅存在于远程的 ssh 运行 bash 命令
- react-native - 如何通过手机锁定 React Native 应用程序屏幕?
- c++ - 模板元:函数参数类型特征检测
- python - ElementTree XML-Parser,附加超链接写入标签
- r - ggplot2 geom_polygon 没有绘制任何东西
- java - 图像元数据未从 jpeg 复制到 tif 文件,使用 Java ImageIO 和十二猴子
- wordpress - 将备份的 Wordpress 从子目录移动到根目录
- swift - “返回函数”和“回调函数”的主要区别是什么?
- python - pyspark中嵌套for循环的实现