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值是:
- 阿尔法罗密欧/阿尔法罗密欧
- 147 / 174
- 2001-2005 / 2005-
- 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”(str_replace 破折号 space)
- “2001- 2005-”(preg_match 4 位数字加破折号)
正如您所看到的,因为在“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
将执行全局替换。所以你不需要 运行 循环或任何东西。
我正在尝试将任何破折号替换到我的字符串中,除非破折号前有四位数字。
情况:我被重写了URL喜欢
/Alfa-Romeo/147/2001-2005/1.9-JTD-100-PK
/Alfa-Romeo/147/2005-
我真正需要的GET值是:
- 阿尔法罗密欧/阿尔法罗密欧
- 147 / 174
- 2001-2005 / 2005-
- 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”(str_replace 破折号 space)
- “2001- 2005-”(preg_match 4 位数字加破折号)
正如您所看到的,因为在“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
将执行全局替换。所以你不需要 运行 循环或任何东西。