我有这样的名字:
$str = 'JAMES "JIMMY" SMITH'
我运行strtolower
,然后ucwords
,它会返回:
$proper_str = 'James "jimmy" Smith'
我想把第一个字母是双引号的第二个字母大写。这是正则表达式。似乎strtoupper不起作用 - regexp只返回未更改的原始表达式。
$proper_str = preg_replace('/"([a-z])/',strtoupper('$1'),$proper_str);
任何线索?谢谢!
答案 0 :(得分:34)
执行此操作的最佳方法可能是使用preg_replace_callback()
:
$str = 'JAMES "JIMMY" SMITH';
echo preg_replace_callback('!\b[a-z]!', 'upper', strtolower($str));
function upper($matches) {
return strtoupper($matches[0]);
}
您可以使用e
上的preg_replace()
(评估)标记,但我通常会反对。特别是在处理外部输入时,它可能非常危险。
答案 1 :(得分:20)
使用e modifier评估替换:
preg_replace('/"[a-z]/e', 'strtoupper("$0")', $proper_str)
$0
包含整个模式的匹配,"
和小写字母匹配。但这并不重要,因为"
在通过strtoupper
发送时不会发生变化。
答案 2 :(得分:20)
使用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中不起作用
答案 3 :(得分:1)
完整的解决方案没有比这更简单/更容易阅读的...
with open('DATA_SPPT.sql','r') as f:
df = pd.read_sql_query(f, con)
输出:
$str = 'JAMES "JIMMY" SMITH';
echo ucwords(strtolower($str), ' "');
这仅仅是在James "Jimmy" Smith
调用中声明双引号和空格作为分隔符的问题。
答案 4 :(得分:0)
这样的事情可能会起到作用:
preg_replace("/(\w+)/e", "ucwords(strtolower('$1'))", $proper_str);
答案 5 :(得分:0)
我这样做没有正则表达式,作为我的自定义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]);
答案 6 :(得分:0)
你应该这样做:
$proper_str =
preg_replace_callback(
'/"([a-z])/',
function($m){return strtoupper($m[1]);},
$proper_str
);
出于安全原因,您不应使用“eval()”。
无论如何,模式修饰符“e”已被弃用。 请参阅:PHP Documentation。
答案 7 :(得分:0)
echo ucwords(mb_strtolower('JAMES "JIMMY" SMITH', 'UTF-8'), ' "'); // James "Jimmy" Smith
ucwords()
有第二个分隔符参数,可选的分隔符包含单词分隔符字符。在那里使用空格''和"
作为分隔符,将正确识别“吉米”。