我期待着这个:
echo preg_replace('/[^a-zA-z0-9]*/', '_', ' foo Bar #1 -');
输出:
'foo_Bar_1_'
但是使用ideone [http://www.ideone.com/Q80v3],它输出:
'__f_o_o__B_a_r__1__'
我不明白为什么会这样,也不知道如何实现我想要的,它输出“foo_Bar_1_”。
如果我删除
*
echo preg_replace('/[^a-zA-z0-9]/', '_', ' foo Bar #1 -');
它输出:
'_foo_Bar__1__'
但我不想要惰性匹配(只有一个下划线pr.替换)。
<?php
echo preg_replace('/[^\w\d]+/', '_', trim(' foo Bar #1 -'));
?>
输出:
foo_Bar_1_
如果您使用
+
而不是 *
,似乎可以工作
编辑
实际上,它输出的是
_foo_Bar_1_
而不是 foo_Bar_1
。但是,我不知道是否有一种仅使用正则表达式的方法可以做到这一点。因为你在字符串的开头和结尾处给了它一些东西,你告诉它用下划线替换。
实际上做你想做的事情的最快方法是正则表达式和修剪:
$str = preg_replace('/[^a-zA-z0-9]+/', '_', $str);
$str = trim($str, '_');
编辑2(也许我会真正阅读您的问题并了解您想要什么) 没关系,jnpcl 的答案非常有效。这只是一个正则表达式!