5

この質問として、次のように大文字を含む文字列を分割できます。

function splitAtUpperCase($string){
    return preg_replace('/([a-z0-9])?([A-Z])/','$1 $2',$string);
}

$string = 'setIfUnmodifiedSince';
echo splitAtUpperCase($string);

出力は「変更されていない場合に設定」

しかし、私はいくつかの変更が必要です:

  • これらの文字が string: に存在する場合、そのコード スニペットはケースを処理しませんÇÖĞŞÜİ。文字を音訳したくありません。それから私は言葉の意味を失います。いくつかの UTF 文字を使用する必要があります。そのコードは、"HereÇonThen" を "HereÇon Then" にします。
  • また、大文字の略語を分割したくありません。単語が「IKnowYouWillComeASAPHere」の場合、「I Know You Will Come ASAP Here」に変換する必要があります
  • すべての文字が大文字の場合は爆発しません。「ドントコメヒア」のように
  • 数値も分解します。「2013年が終わる前」から「2013年が終わる前」
  • 最初の文字がハッシュ キー (#) の場合は展開します。

ケースと期待される結果

  1. 「明日ここに来る」 => 「明日ここに来る」
  2. "KissYouTODAY" => "Kiss you TODAY"
  3. "comeÜndeHere" => "comeÜndeHere"
  4. "決して言わない" => "決して言わない"
  5. "2013willCome" => "2013 will come"
  6. 「2013 年末まで」 => 「2013 年末まで」
  7. "IKnowThat" => "私はそれを知っている"
  8. "#whatiknow" => "#whatiknow"

これらの場合、後続のstr_replace操作を使用します。ループが単語をチェックするのにあまり効果がない短い解決策を探します。できればaspreg_replaceやetc.の方がいいですね。

convert編集:この PHP フィドル内の関数を変更することで、誰でも彼のソリューションを試すことができます: http://ideone.com/9gajZ8

4

4 に答える 4

2

/([[:lower:][:digit:]])?([[:upper:]]+)/uするべきです。

ここで/u は Unicode 文字に使用されます。([[:upper:]]+)大文字のシーケンスに使用されます。

ノート。文字の大文字と小文字は、使用している文字セットによって異なります。

于 2013-01-08T11:31:35.220 に答える
0

Unicode Regex が必要です: \p{Lu} for upercaseそして\p{Li} for lowercase

したがって、使用法は次のようになります。 /([\p{Ll}0-9])?([\p{Lu}])/

于 2013-04-12T10:45:42.507 に答える