我有这样的名字:
$str = 'JAMES "JIMMY" SMITH'
我运行strtolower
,然后运行ucwords
,返回如下结果:
$proper_str = 'James "jimmy" Smith'
我想把第一个字母是双引号的单词的第二个字母大写。下面是正则表达式。看起来strtoupper不起作用-正则表达式只是返回未更改的原始表达式。
$proper_str = preg_replace('/"([a-z])/',strtoupper('$1'),$proper_str);
有线索吗?谢谢!!
8条答案
按热度按时间ppcbkaq51#
最好的方法可能是使用
preg_replace_callback()
:你可以在
preg_replace()
上使用e
(eval)标志,但是我通常不建议这样做,特别是在处理外部输入时,这是非常危险的。wswtfjt72#
使用
preg_replace_callback
-但是你不需要添加额外的命名函数,而是使用匿名函数。从PHP 5.5开始不建议使用
/e
,并且在PHP 7中不起作用cig3rfwq3#
使用e modifier计算替换:
其中
$0
包含整个模式的匹配,因此"
和小写字母。但这并不重要,因为"
在通过strtoupper
发送时不会改变。rqdpfwrv4#
一个完整的解决方案没有比这更简单/更容易阅读了...
代码:https://3v4l.org/rrXP7
输出量:
这只是在
ucwords()
调用中声明双引号和空格作为分隔符的问题。不。我以前的想法是不正确的。没有比这个多字节安全的标题大小写技术更简单的了!
代码:(Demo)
输出量:
fhity93d5#
我在没有regex的情况下完成了这个操作,这是我的自定义
ucwords()
函数的一部分。6mzjoqzu6#
您应该这样做:
出于安全原因,不应使用“eval()”。
无论如何,模式修饰符“e”已被弃用。请参见:PHP文档。
bzzcjhmw7#
ucwords()
具有第二个分隔符参数,可选分隔符包含单词分隔符字符。使用空格' '和"
作为分隔符,“Jimmy”将被正确识别。cedebl8k8#
类似这样的东西可能会起到作用: