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 / 1.9 JTD 100 PK

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

$value = str_replace('-', ' ', $value);   
$value = preg_replace('/\d{4}/', '[=13=]-', $value);

当我用

询问代码时,这导致剥离每个破折号
str_replace('-', ' ', $value);

我期待 \d(任何数字){4}(恰好 4),$0-(匹配后粘贴破折号)在刚刚剥离的 $value 上,str_replace 破折号代表 space会做的伎俩,但它不是..

在我看来,像“2001-2005”这样的字符串会逐步变成(这是它打破的一点,因为它正确地将破折号替换为 space)

正如您所看到的,因为在“2001”和“2005”上有双重匹配,所以在它后面放置了一个破折号。

当我做这样的事情时

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

前两个替换字符串后,如“1.9 JTD 100 PK”将变为 1.9JTD100PK,这是不需要的!除此之外,在最后一个例子中,我在“2005”之后仍然得到了一个不需要的破折号。像“2005-”这样的字符串将通过添加第三步来修复。

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

您可以使用负向后视来要求破折号前面没有四位数字。

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

(?<! ... ) 是负面看组。

如果你使用像这样的东西,你实际上可以做到这一点而不用回头看:

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

你可以在这里看到这个工作:http://ideone.com/aKK3jD

请注意 preg_replace 将执行全局替换。所以你不需要 运行 循环或任何东西。