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

ST8*_*T80 3 php regex string str-replace

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

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

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

str_replace([' ', ',', '.','?'], '-', strtolower($pathname));
Run Code Online (Sandbox Code Playgroud)

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

有人可以帮我吗?

Mar*_*tin 7

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

虽然穆罕默德的答案几乎没有,这里是一个更全面的工作PCRE正则表达式的方法,并解释它是如何工作的,所以你可以根据需要使用它:

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

这是如何工作的:

  • 匹配以下列表中的单个字符 [\s.,-]+
    • +量词在一次和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)
    • \s匹配任何空白字符(等于 [ \r\n\t\f\v])
    • .,-匹配列表中的单个字符.,-(区分大小写)
    • 破折号-必须位于结束的中[]集。

结果:

这:查看 1. 地方

变成:

check-out-the-1-place

这:检查 - 1.地方

成为

check-out-the-1-place


更远:

我会更进一步,假设您将它用于 URL slug(什么?!);去掉所有从字符串非字母数字字符和具有单取代-按照典型网站蛞蝓。

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

这是如何工作的:

  • 匹配以下列表中存在的单个字符NOT ( ^)[a-z0-9]+
    • +量词在一次和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)
    • a-z a(索引 97)和 z(索引 122)之间范围内的单个字符(区分大小写)
    • 0-9 0(索引 48)和 9(索引 57)之间范围内的单个字符(区分大小写)
    • 所述i在末端指示的判断是壳体在敏感

例子:

退房 - 没有!1. 放置

变成:

check-out-the-1-Place