我正在尝试将任何短划线替换为我的字符串,除非短划线前有四位数字。
情况:我得到了重写的网址,如
/Alfa-Romeo/147/2001-2005/1.9-JTD-100-PK
/Alfa-Romeo/147/2005-
我极度需要的GET值是:
通过我的功能并过滤结果。我试着:
$value = str_replace('-', ' ', $value);
$value = preg_replace('/\d{4}/', '$0-', $value);
当我用我的
询问代码时,这导致剥离每个破折号str_replace('-', ' ', $value);
我期待\ d(任何数字){4}(正好4),$ 0-(在匹配后粘贴破折号)在刚刚剥离的$值上用str_replace破折号表示空间可以做到这一点但不是.. < / p>
在我看来,像“2001-2005”这样的字符串将会逐步变为(这是因为它正在将短划线更换为正确的空间而突破了这一点)
正如你所看到的,因为有一个双重匹配以及“2001”和“2005”,所以它在它之后放了一个短划线。
当我做这样的事情时
$value = str_replace(' ', '', $value);
在前两个替换后,像“1.9 JTD 100 PK”这样的字符串将变为1.9JTD100PK,这是不需要的!除此之外,在最后一个例子中,我的“2005”之后仍然有一个不需要的冲刺。像“2005-”这样的字符串将通过添加第三步来修复。
希望你们能理解这个问题并为我解决这个问题吗?
答案 0 :(得分:1)
你可以使用负面观察要求破折号前面没有四位数。
$value = preg_replace('/(?<!\d{4})-/', '', $value);
(?<! ... )
是群体背后的负面看法。
答案 1 :(得分:0)
如果你使用类似的东西,你可以实际做到这一点而不用看看:
$value = preg_replace('/((?:\d{4}-|[^-])*)-?/', "$1 ", $value);
你可以在这里看到这个:http://ideone.com/aKK3jD
请注意preg_replace
将进行全局替换。所以你不需要在循环或任何事情中运行它。