PHP:preg_replace 数组不会用连字符替换空格

PHP: preg_replace with arrays will not replace whitespace with hyphen

这让我费尽心思。这段代码来自一个复杂得多的函数,但我遇到的基本问题源于此。

假设:

$string = 'new page!';

为什么:

$string = preg_replace(array('/\s/', '/\W/'), array('_', ''), $string);

正确生成以下结果:

'new_page'

但是这个:

$string = preg_replace(array('/\s/', '/\W/'), array('-', ''), $string);

将return:

'newpage'

我试过逃脱,但似乎无济于事。就好像连字符被完全忽略了。

更奇怪:

$string = preg_replace('/\s/', '-', $string);

将正常工作 return 'new-page',但我想同时替换空格和非单词字符。

有人知道这是怎么回事吗?

$string = preg_replace(array('/\s/', '/\W/'), array('-', ''), $string);

在第一步中,空格被替换为 -,在第二步中,被替换的连字符和 ! 都被删除(替换为空字符串),因为 - 是也是一个非单词字符。请注意,第一个替换的输出作为输入提供给第二个替换。

$string = preg_replace(array('/\s/', '/\W/'), array('_', ''), $string);

产生 new_page 因为首先空格被替换为 _ 并且在第二次替换时所有非单词字符必须被替换为空字符串。由于 _ 不是非单词字符,因此不会被删除。 ! 是一个非单词字符,所以它被删除了。

您可以这样做以获得您想要的输出。

$string = 'new page!';
echo preg_replace(array('/\s/', '/[^-\w]/'), array('-', ''), $string);

输出:

new-page

更改顺序。

$string = 'new page!';
echo preg_replace(array('/[^\s\w]/', '/\s/'), array('', '-'), $string);

输出:

new-page

因为用连字符替换空格后,\W 会替换该非单词字符。我个人会使用回调函数来执行此操作。您可以根据自己的需要进行调整...

$str = preg_replace_callback('~(\s)|\W~', 
     function($m) {
        return $m[1] ? '-' : '';
     }, $str);