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

时间:2015-03-19 18:30:00

标签: php regex replace preg-replace str-replace

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

情况:我得到了重写的网址,如

/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
  5. 通过我的功能并过滤结果。我试着:

    $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”(str_replace dash for space)
    • “2001- 2005-”(preg_match 4位数添加破折号)

    正如你所看到的,因为有一个双重匹配以及“2001”和“2005”,所以它在它之后放了一个短划线。

    当我做这样的事情时

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

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

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

2 个答案:

答案 0 :(得分:1)

你可以使用负面观察要求破折号前面没有四位数。

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

(?<! ... )是群体背后的负面看法。

答案 1 :(得分:0)

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

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

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

请注意preg_replace将进行全局替换。所以你不需要在循环或任何事情中运行它。