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

Php 用下划线替换空格和括号的正则表达式,php,regex,preg-replace,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) 但是,它会将最后一个)转换为下划线,这对于我的使用是不可接受的。我可以很容易地在一个单独的函数中删

我有以下格式的字符串:

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)

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

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

$result = preg_replace('~[^A-Z]+([A-Z]+)(?:[^A-Z]+$)?~i', '_$1', $string);
也许是这样的:

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


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

感谢您早些时候向我指出,我删除了我的答案。你的方法显然是正确的。如果将模式替换为
\w+
@revo yes,则更实用。我考虑过这一点(事实上,我最初就是这样写的),但我怀疑OP是想为一个只用拉丁字母写的URL制作一个slug。但我看到格式限制为4个数字&我喜欢最佳最短路径。看起来你可能想制作一个URL slug。如果是这样的话,我打赌如果你搜索“regex来构建一个URL slug”,你会找到你的答案的preg_replace是最好的使用方法。谢谢你的提醒,干杯。@Fred ii-,哦,我没有真正检查你的代码,但是这个想法不错,但是它没有解决括号方面的问题。
$result = preg_replace('~([^a-zA-Z\n\r()]+)~', '_', $string);