php preg_replace将引号后的字母大写

db2dz4w8  于 2022-12-10  发布在  PHP
关注(0)|答案(8)|浏览(140)

我有这样的名字:

$str = 'JAMES "JIMMY" SMITH'

我运行strtolower,然后运行ucwords,返回如下结果:

$proper_str = 'James "jimmy" Smith'

我想把第一个字母是双引号的单词的第二个字母大写。下面是正则表达式。看起来strtoupper不起作用-正则表达式只是返回未更改的原始表达式。

$proper_str = preg_replace('/"([a-z])/',strtoupper('$1'),$proper_str);

有线索吗?谢谢!!

ppcbkaq5

ppcbkaq51#

最好的方法可能是使用preg_replace_callback()

$str = 'JAMES "JIMMY" SMITH';
echo preg_replace_callback('!\b[a-z]!', 'upper', strtolower($str));

function upper($matches) {
  return strtoupper($matches[0]);
}

你可以在preg_replace()上使用e(eval)标志,但是我通常不建议这样做,特别是在处理外部输入时,这是非常危险的。

wswtfjt7

wswtfjt72#

使用preg_replace_callback-但是你不需要添加额外的命名函数,而是使用匿名函数。

$str = 'JAMES "JIMMY" SMITH';
echo preg_replace_callback('/\b[a-z]/', function ($matches) {
     return strtoupper($matches[0]);
}, strtolower($str));

从PHP 5.5开始不建议使用/e,并且在PHP 7中不起作用

cig3rfwq

cig3rfwq3#

使用e modifier计算替换:

preg_replace('/"[a-z]/e', 'strtoupper("$0")', $proper_str)

其中$0包含整个模式的匹配,因此"和小写字母。但这并不重要,因为"在通过strtoupper发送时不会改变。

rqdpfwrv

rqdpfwrv4#

一个完整的解决方案没有比这更简单/更容易阅读了...
代码:https://3v4l.org/rrXP7

$str = 'JAMES "JIMMY" SMITH';
echo ucwords(strtolower($str), ' "');

输出量:

James "Jimmy" Smith

这只是在ucwords()调用中声明双引号和空格作为分隔符的问题。
不。我以前的想法是不正确的。没有比这个多字节安全的标题大小写技术更简单的了!
代码:(Demo

echo mb_convert_case($str, MB_CASE_TITLE);

输出量:

James "Jimmy" Smith
fhity93d

fhity93d5#

我在没有regex的情况下完成了这个操作,这是我的自定义ucwords()函数的一部分。

$parts = explode('"', $string, 3); 
if(isset($parts[2])) $string = $parts[0].'"'.ucfirst($parts[1]).'"'.ucfirst($parts[2]);            
else if(isset($parts[1])) $string = $parts[0].'"'.ucfirst($parts[1]);
6mzjoqzu

6mzjoqzu6#

您应该这样做:

$proper_str = 
    preg_replace_callback(
        '/"([a-z])/',
        function($m){return strtoupper($m[1]);},
        $proper_str
);

出于安全原因,不应使用“eval()”。
无论如何,模式修饰符“e”已被弃用。请参见:PHP文档。

bzzcjhmw

bzzcjhmw7#

echo ucwords(mb_strtolower('JAMES "JIMMY" SMITH', 'UTF-8'), ' "'); // James "Jimmy" Smith

ucwords()具有第二个分隔符参数,可选分隔符包含单词分隔符字符。使用空格' '和"作为分隔符,“Jimmy”将被正确识别。

cedebl8k

cedebl8k8#

类似这样的东西可能会起到作用:

preg_replace("/(\w+)/e", "ucwords(strtolower('$1'))", $proper_str);

相关问题