1

我有以下格式的一些字符串:

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)

但是,它将最后)一个转换为下划线,这对于我的使用是不可接受的。我可以很容易地在一个单独的函数中删除它,但我想知道它是否可能与单个正则表达式有关?

4

3 回答 3

2
$result = preg_replace('~[^A-Z]+([A-Z]+)(?:[^A-Z]+$)?~i', '_$1', $string);
于 2013-08-23T19:05:57.760 回答
1
$result = preg_replace('~([^a-zA-Z\n\r()]+)~', '_', $string);

在这里试试

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

于 2013-08-23T19:25:21.927 回答
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
于 2013-08-23T19:08:55.133 回答