preg_replace_callback多匹配替换疑问:已匹配转大写但未替换原文本?
问题解答
首先,你的代码其实是可以实现预期效果的,先帮你理清preg_replace_callback的工作逻辑,就能解决你的疑惑了:
- 当你调用这个函数时,它会先遍历目标字符串,用正则
/(?<=_)./匹配所有_后面的单个字符(也就是原字符串里的b和o); - 每匹配到一个字符,就触发你传入的匿名函数,把匹配到的内容(
$matches[0])转成大写; - 匿名函数返回的大写字符会直接替换掉原字符串中被匹配到的那个字符;
- 所有匹配替换完成后,
preg_replace_callback会把整个修改后的字符串作为返回值返回。
你之所以产生疑惑,大概率是没接住这个返回值!这个函数不会直接修改原字符串$model_name,而是生成一个新的字符串,你需要用变量接收它才行。正确的完整用法应该是这样:
$model_name = "foo_bar_one"; // 接收函数返回的修改后字符串 $converted_name = preg_replace_callback( '/(?<=_)./', function ($matches) { return strtoupper($matches[0]); }, $model_name ); echo $converted_name; // 输出 foo_Bar_One
额外补充你的正则逻辑
你用的(?<=_).是正向肯定后顾断言,它只会匹配_后面的字符,但不会把_本身纳入匹配范围,所以替换时只会修改_后的小写字母,完全符合你要的foo_Bar_One格式需求,这部分的思路是完全正确的。
内容的提问来源于stack exchange,提问作者Rehan
相关产品推荐
相关产品推荐

