PHP:preg_replace()破折号在任何破折号之前都需要{4}位数字


PHP: preg_replace() dash expect {4} digits before any dash

我正在尝试将任何短划线替换到字符串中,除非短划线前面有四位数字。

情境:我得到了类似的重写URL

/Alfa-Romeo/147/2001-2005/1.9-JTD-100-PK
/Alfa-Romeo/147/2005-

我实际需要的GET值是:

  1. 阿尔法·罗密欧
  2. 147/174
  3. 2001-2005/2005-
  4. 1.9 JTD 100 PK

通过我的函数并过滤结果。我试着:

$value = str_replace('-', ' ', $value);   
$value = preg_replace('/'d{4}/', '$0-', $value);

这导致在我用询问代码时剥离了每个破折号

str_replace('-', ' ', $value);

我原以为''d(任何数字){4}(正好是4),$0-(在比赛后粘贴破折号)在刚刚剥离的$value上用str_replace破折号表示空格会起作用,但事实并非如此。。

在我看来,像"2001-2005"这样的字符串会一步一步地变成

  • "2001 2005"(str_replace破折号表示空格)
  • "2001-2005-"(preg_match 4位数字加短划线)

正如你所看到的,由于有两场比赛,以及在"2001"answers"2005",它在后面加了一个破折号

当我做这样的事情时

$value = str_replace(' ', '', $value);

在前两个替换后,类似"1.9 JTD 100 PK"的字符串将变成1.9JTD100PK,这是不需要的!此外,在上一个例子中,我在"2005"之后仍然有一个不想要的破折号。添加第三步就可以修复像"2005-"这样的字符串。

希望你们能理解这个问题,并能为我解决这个问题?

您可以使用负向后看来要求短划线前面没有四位数字。

$value = preg_replace('/(?<!'d{4})-/', '', $value);

CCD_ 1是一个消极的观察组。

如果你使用类似的东西,你实际上可以做到这一点

$value = preg_replace('/((?:'d{4}-|[^-])*)-?/', "$1 ", $value);

你可以在这里看到这一点:http://ideone.com/aKK3jD

请注意,preg_replace将执行全局替换。所以你不需要在一个循环或任何事情中运行这个。