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\p{Ll}これは、他の文字が前にない場合 ( pattern を使用した負の後読み)、大文字相当する ( pattern を使用した) Unicode 文字に一致します\p{L}。次に、大文字に相当するものに置き換えます。

実際に見てください

更新:空白のみを単語の境界と見なすつもりのようです。これは、正規表現で行うことができます

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

Unicode以外の文字の場合、文字列をキャメルケースに変換するには次のように機能します。

preg_replace('/\b([a-z])/e', 'strtoupper("$1")', strtolower($str));
于 2012-05-10T09:30:08.637 に答える
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

このようなことを試してください(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 に答える