代码之家  ›  专栏  ›  技术社区  ›  ST80

如何用连字符替换点、空格和逗号,并避免使用php使用双连字符?

  •  1
  • ST80  · 技术社区  · 6 年前

    当我替换字符串中的空格、点和逗号时,有时会出现双连字符。

    例如转弯 check out the 1. place check-out-the-1--place

    check-out-the-1-place -所以每个单词之间只有一个连字符。 这是我的密码:

    str_replace([' ', ',', '.','?'], '-', strtolower($pathname));
    

    现在,我知道它为什么返回双连字符,但我不知道如何解决这个问题。

    有人能帮我吗?

    2 回复  |  直到 6 年前
        1
  •  7
  •   Martin Asuquo12    6 年前

    我怎样才能避免呢?我希望它是check-out-the-1-place-这样每个单词之间只有一个连字符。这是我的密码:

    Mohammad's answer 几乎 在那里,这里有一个更充分的工作 PCRE regex 方法和说明,以便您可以根据需要使用:

    $str = trim(strtolower($pathname));
    $newStr = preg_replace('/[\s.,-]+/', '-', $str);
    

    工作原理:

    • [\s.,-]+
      • + 之间的量词匹配 一无限制 多次,尽可能多次,需要时回馈(贪婪)
      • \s 匹配任何空格字符(等于[ \r\n\t\f\v
      • .,- 匹配列表中的单个字符 (区分大小写)
      • 破折号 - 一定要准时来 结束 [] 设置。

    结果:

    变成:

    check-out-the-1-place

    以及

    变成


    进一步:

    a what?! 全部的 将字符串中的非字母数字字符替换为单个 -

     $newStr = preg_replace('/[^a-z0-9]+/i', '-', $str);
    

    工作原理:

    • 匹配单个字符 不是 ( ^ )出现在下面的列表中 [a-z0-9]+
      • + 一无限制 多次,尽可能多次,需要时回馈(贪婪)
      • a-z
      • 0-9 在0(索引48)和9(索引57)之间的单个字符(区分大小写)
      • 这个 i 最后表明判决是正确的 区分大小写

    例子:

    check-out-the-1-Place

        2
  •  3
  •   Mohammad DefenestrationDay    6 年前

    你可以用 preg_replace() 而是使用regex来选择多个特定字符。

    $newStr = preg_replace("/[\s.,]+/", "-", $str)
    

    demo