PHP preg_replace适用于所有类型的年份格式(YYYY、YYYY-YYYY 、YYYY - YYYY)



尝试仅使用preg_replace对包含年份格式(如20181950-20181950 - 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 3500HD2014没有闯入新行......而且我也无法弄清楚如何进行年份范围(doh!)甚至引用此 JavaScript 正则表达式验证范围内的年份

简化替换逻辑的一种方法是认识到您希望在每 4 位数字年份后添加一个<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>

演示

preg_replace_callback()将允许您验证/提取目标子字符串,并在一次传递中进行条件替换。

  • <br>必须在所有年份/年份范围之前写入,只要它不是字符串的开头。 第一个捕获组是s*,因此它将在目标年份/年份范围之前捕获零个或多个空白字符。 此元素将始终作为[1]存在于$m数组中。
  • 第二个捕获组是第一个或唯一的年份值。 这是实现回调函数所必需的。 这在$m数组中[2]
  • 至于可选的中学年份值,它必须跟在零个或多个空格后面,然后是一个连字符,然后是零个或多个空格。因为没有捕获组可以跟踪此捕获组,所以 php 只有在找到该组时才会为其生成一个元素 -isset()用于检查[3]是否存在。
  • 最初,我使用b来确保年份值不是较大数字子字符串的子字符串,但字符串的格式允许使用空格匹配来确认准确匹配。

代码:(演示)(模式演示)

$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

相关内容

  • 没有找到相关文章

最新更新