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);
这让我费尽心思。这段代码来自一个复杂得多的函数,但我遇到的基本问题源于此。
假设:
$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);