preg_replace在引用后大写字母

时间:2010-04-14 14:42:29

标签: php regex

我有这样的名字:

$str = 'JAMES "JIMMY" SMITH'

我运行strtolower,然后ucwords,它会返回:

$proper_str = 'James "jimmy" Smith'

我想把第一个字母是双引号的第二个字母大写。这是正则表达式。似乎strtoupper不起作用 - regexp只返回未更改的原始表达式。

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

任何线索?谢谢!

8 个答案:

答案 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)

完整的解决方案没有比这更简单/更容易阅读的...

代码:https://3v4l.org/rrXP7

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()有第二个分隔符参数,可选的分隔符包含单词分隔符字符。在那里使用空格''和"作为分隔符,将正确识别“吉米”。