作为this question ,我可以像这样拆分包含大写字母的字符串:
function splitAtUpperCase($string){
return preg_replace('/([a-z0-9])?([A-Z])/','$1 $2',$string);
}
$string = 'setIfUnmodifiedSince';
echo splitAtUpperCase($string);
输出是“设置如果未修改自”
但我需要一些修改:
- 当这些字符存在于字符串中时,该代码片段不处理以下情况:
ÇÖĞŞÜİ
。我不想音译这些字符。然后我失去了这个词的意义。我需要使用一些 UTF 字符。该代码使“HereÇonThen”变为“HereÇon Then” - 我也不想拆分大写缩写。如果单词是“IKnowYouWillComeASAPHere”,我需要将其转换为“我知道你会尽快来到这里”
- 如果所有字母都是大写,不要爆炸。喜欢“别过来”
- 也分解数值。 “2013 年底之前”到“2013 年底之前”
- 如果第一个字符是散列键 (#),则展开。
案例及预期结果
- "comeHEREtomorrow"=> "come HERE tomorrow"
- "KissYouTODAY"=> "今天吻你"
- "comeÜndeHere"=> "来到这里"
- "永不言败"=> "永不言败"
- "2013willCome"=> "2013 会来"
- "2013 年结束前"=> "2013 年结束前"
- “IKnowThat”=>“我知道”
- "#whatiknow"=> "#whatiknow"
对于这些情况,我使用后续的 str_replace
操作。我正在寻找一个简短的解决方案,它不会让循环太多来检查单词。如果可能,最好将它作为 preg_replace
或其他。
编辑:任何人都可以通过更改此 PHP fiddle 中的 convert
函数来尝试他的解决方案:http://ideone.com/9gajZ8
最佳答案
/([[:lower:][:digit:]])?([[:upper:]]+)/u
应该这样做。
此处/u
用于Unicode字符。 ([[:upper:]]+)
用于大写字母序列。
注意。字母的大小写取决于您使用的字符集。
关于php - 分解关于大写或数字字符的 UTF8 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14213932/