我在期待这个:
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__'
但我不想要懒惰匹配(只有一个下划线替换)
答案 0 :(得分:3)
<?php
echo preg_replace('/[^\w\d]+/', '_', trim(' foo Bar #1 -'));
?>
<强>输出:强>
foo_Bar_1_
答案 1 :(得分:2)
如果您使用+
而不是*
修改强>
实际上,这会输出_foo_Bar_1_
而不是foo_Bar_1
。但是,我不知道是否只有正则表达式才能这样做。因为你要在字符串的开头和结尾给它一些东西,你要告诉它用下划线代替。
实际实现你想要的东西的最快方法是正则表达式和修剪:
$str = preg_replace('/[^a-zA-z0-9]+/', '_', $str);
$str = trim($str, '_');
编辑2(可能我实际上会阅读您的问题并了解您想要的内容) 没关系,jnpcl的答案非常有效。它只是一个正则表达式!