php - 分解关于大写或数字字符的 UTF8 字符串

标签 php regex string utf-8 preg-replace

作为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 年底之前”
  • 如果第一个字符是散列键 (#),则展开。

案例及预期结果

  1. "comeHEREtomorrow"=> "come HERE tomorrow"
  2. "KissYouTODAY"=> "今天吻你"
  3. "comeÜndeHere"=> "来到这里"
  4. "永不言败"=> "永不言败"
  5. "2013willCome"=> "2013 会来"
  6. "2013 年结束前"=> "2013 年结束前"
  7. “IKnowThat”=>“我知道”
  8. "#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/

相关文章:

html - 如何匹配任一正则表达式?

regex - 在 Powershell 中使用函数替换

Python:如何从字符串中删除数字周围的引号

java - 优化基于正则表达式的查找函数

c# - 如何将字符串反转为二进制

string - 查找具有相似文本的文章的算法

php - 如何正确使用sql命令mid或substring?

php - PhpStorm中生成Getter和Setter时是否可以去掉自动生成的注释

php - 我正在使用 wp_nav_menu & strip_tags 来输出我的 WP 菜单,但我也想使用 CSS 类

php - 如何在 Laravel 中构建自动完成多重标记