正则表达式用下划线替换空格和括号

时间:2013-08-23 19:03:14

标签: php regex preg-replace

我有以下格式的字符串:

this is a string
This is a string
This is a (string)
This is a  string

我希望正则表达式将其转换为以下内容:

this_is_a_string

没有领先

我有以下使用preg_replace,这几乎让我一路走来:

preg_replace('/[^A-Za-z]+/', '_', $string)

但是,它会将最后一个)转换为下划线,这是我不能接受的。我可以轻松地在一个单独的函数中修剪它,但我想知道它是否可以用一个正则表达式?

3 个答案:

答案 0 :(得分:2)

$result = preg_replace('~[^A-Z]+([A-Z]+)(?:[^A-Z]+$)?~i', '_$1', $string);

答案 1 :(得分:1)

$result = preg_replace('~([^a-zA-Z\n\r()]+)~', '_', $string);

试试HERE

确保字符串中没有尾随或前导空格,否则它也会被替换...使用trim($string)将其删除

答案 2 :(得分:0)

正则表达式是一个很好的工具,但有一些它们并不适合。转换字符的情况是正则表达式单独做不到的一件事。您可以使用preg_replace_callback函数将匹配的文本转换为小写,但这实际上很简单,只需稍微更改一下逻辑即可完成。

也许是这样的事情:

$string = 'This is a (string)';
preg_match_all("/[a-zA-Z]+/", $string, $matches);
$string = strtolower(implode('_', $matches[0])); // this_is_a_string