3

我需要将字符串转换为驼峰式大小写,这很容易使用:

mb_convert_case($str, MB_CASE_TITLE, "UTF-8")

但是如果字符串包含非字母数字字符怎么办:

$str = 'he said "hello world"';
echo mb_convert_case($str, MB_CASE_TITLE, "UTF-8");

结果是:

He Said "hello World"

但是我需要:

He Said "Hello World"

我们该如何处理呢?

谢谢

4

5 回答 5

2

用正则表达式。

如果您只打算使用非重音拉丁字符,它可以很简单

$str = 'he said "hello WORLD"';
echo preg_replace('/\b([a-z])/e', 'strtoupper(\'$1\')', strtolower($str));

这匹配任何前面有单词边界的小写无重音拉丁字母。该字母被替换为等效的大写字母。

如果您希望它也可以与其他语言和脚本一起使用,您将不得不花哨:

$str = 'he said "καλημέρα ΚΌΣΜΕ"'; // this has to be in UTF-8
echo preg_replace('/(?<!\p{L})(\p{Ll})/eu',
                  'mb_convert_case(\'$1\', MB_CASE_UPPER, \'UTF-8\')',
                  mb_convert_case($str, MB_CASE_LOWER, 'UTF-8'));

要理解这一点,您需要参考 PCRE 的Unicode功能,并注意我已将u修饰符添加到preg_replace. 这匹配任何具有大写等效项(带有 pattern \p{Ll})的 unicode 字母,前提是它前面没有任何其他字母(带有 pattern 的负向lookbehind\p{L})。然后将其替换为等效的大写字母。

看到它在行动

更新:看起来您打算仅将空格视为单词边界。这可以通过正则表达式来完成

(?<=\s|^)([a-z])
(?<=\s|^)(\p{Ll})
于 2012-05-10T09:16:26.553 回答
0

使用手册!:D 在 php.net 上找到

<?php

function ucwordsEx($str, $separator){

      $str = str_replace($separator, " ", $str);
      $str = ucwords(strtolower($str));
      $str = str_replace(" ", $separator, $str);
      return $str;

}
/*
Example:
*/
echo ucwordsEx("HELLO-my-NAME-iS-maNolO", "-");
/*
Prints: "Hello My Name Is Manolo"
*/

?>
于 2012-05-10T09:12:52.513 回答
0

对于非 unicode 字符,以下将用于将字符串转换为驼峰式大小写:

preg_replace('/\b([a-z])/e', 'strtoupper("$1")', strtolower($str));
于 2012-05-10T09:30:08.637 回答
0

尝试这样的事情(根据 PHP.net 评论)

$str = 'he said "hello world"';
echo preg_replace('/([^a-z\']|^)([a-z])/ie', '"$1".strtoupper("$2")', strtolower($str));
于 2012-05-10T09:09:09.113 回答
0

这是非常简单的代码

echo  ucwords('he said '.ucwords('"hello world"')) ;

输出他说你好世界

于 2016-08-22T17:43:17.373 回答