首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >所有类型的年份格式的preg_replace ( YYYY,YYYY,YYYY,YYYY)

所有类型的年份格式的preg_replace ( YYYY,YYYY,YYYY,YYYY)
EN

Stack Overflow用户
提问于 2018-05-18 02:48:31
回答 2查看 126关注 0票数 1

尝试只使用preg_replace对包含20181950-20181950 - 2018等年份格式的字符串(添加html行中断)进行修改。

代码语言:javascript
复制
$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

前两个很好(虽然我在正确范围上有困难),但最后一个是捕捉所有实例。

像这样:

代码语言:javascript
复制
* 2007
** 2008 - 2013

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

我如何才能完全分离这些年格式,使我可以唯一地改变每一个单独的?

样本代码:

代码语言:javascript
复制
<?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;

输出

代码语言:javascript
复制
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

抱歉,真的很困惑。

基本上,我所做的是试图循环它,只做一个换行(没有爆炸的字符串).很明显,用我的准则,它把每一个都输出到自己的线路上.

试图得到这样的输出

代码语言:javascript
复制
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

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

代码语言:javascript
复制
$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);

这是我的剧本的实际摘录

代码语言:javascript
复制
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变体.)

就像这样

代码语言:javascript
复制
* 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 regex在范围内验证年份

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-18 06:01:51

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

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

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

代码语言:javascript
复制
$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);

输出:

代码语言:javascript
复制
<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
EN

Stack Overflow用户

发布于 2018-05-18 02:58:43

简化您的替换逻辑的一种方法是,您要在每4位数的年份之后添加一个<br>,而后面没有一个破折号、一个空格和一个破折号。我们可以很容易地用负面展望来表达这一点:

代码语言:javascript
复制
(\d{4})(?!\s?-)

代码示例:

代码语言:javascript
复制
$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>

演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50403091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档