【发布时间】:2018-05-18 02:48:31
【问题描述】:
尝试仅使用 preg_replace 对包含诸如 2018 1950-2018 和 1950 - 2018 等年份格式的字符串进行修改(添加 html 换行符)
$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
但是是的..这是我得到的最好的
$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 regex validate years in range
【问题讨论】:
-
好的。有什么问题吗?
-
我怎样才能完全分离这些年份格式,以便我可以单独更改每个格式?
-
那么您能否发布一个涵盖所有案例的示例输入字符串,并为该示例字符串发布您想要的输出?
-
第三种模式需要严格验证吗?你不希望
**重复出现对吧? -
Tim 的回答有所帮助,但我在实现后向检查方面遇到了麻烦……负前瞻工作有效,但仍与
2008- * 2013之类的输入匹配
标签: php regex date preg-replace pcre