PHP:preg_replace with array不会用连字符替换空格
这让我头疼。这段代码来自一个更复杂的函数,但我遇到的基本问题来自这里 假设:PHP:preg_replace with array不会用连字符替换空格,php,regex,preg-replace,Php,Regex,Preg Replace,这让我头疼。这段代码来自一个更复杂的函数,但我遇到的基本问题来自这里 假设: $string = 'new page!'; 为什么: $string = preg_replace(array('/\s/', '/\W/'), array('_', ''), $string); 正确产生以下结果: 'new_page' 但这是: $string = preg_replace(array('/\s/', '/\W/'), array('-', ''), $string); 将返回: 'new
$string = 'new page!';
为什么:
$string = preg_replace(array('/\s/', '/\W/'), array('_', ''), $string);
正确产生以下结果:
'new_page'
但这是:
$string = preg_replace(array('/\s/', '/\W/'), array('-', ''), $string);
将返回:
'newpage'
我试过逃跑,但似乎什么也没用。就像连字符被完全忽略了一样
更奇怪的是:
$string = preg_replace('/\s/', '-', $string);
将正常工作并返回“new page”,但我想同时替换空白字符和非单词字符
有人知道这是怎么回事吗
$string = preg_replace(array('/\s/', '/\W/'), array('-', ''), $string);
在第一步中,空格替换为-
,在第二步中,替换的连字符和代码>被剥离(替换为空字符串),因为-
也是非单词字符。请注意,第一次替换的输出作为第二次替换的输入被联邦化
$string = preg_replace(array('/\s/', '/\W/'), array('_', ''), $string);
生成新页面
,因为在第一次替换时,空格被替换为,
,在第二次替换时,所有非单词字符必须被替换为空字符串。由于\uu
不是非单词字符,因此它不会被删除<代码>
是非单词字符,因此它已被删除
您可以这样做以获得所需的输出
$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);
当然显然我盯着这件事看太久了。反转搜索数组,然后让单词字符regex忽略空格,已经解决了这个问题!