我有以下格式的字符串:
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)
但是,它会将最后一个)
转换为下划线,这是我不能接受的。我可以轻松地在一个单独的函数中修剪它,但我想知道它是否可以用一个正则表达式?
答案 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