php preg_replace问题

时间:2011-04-15 22:21:35

标签: php regex preg-replace

我在期待这个:

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__'

但我不想要懒惰匹配(只有一个下划线替换)

2 个答案:

答案 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的答案非常有效。它只是一个正则表达式!