Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:preg_replace with array不会用连字符替换空格_Php_Regex_Preg Replace - Fatal编程技术网

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忽略空格,已经解决了这个问题!