【问题标题】:How to transform a string to lowercase with preg_replace如何使用 preg_replace 将字符串转换为小写
【发布时间】:2012-04-13 21:47:24
【问题描述】:

我只是坚持这一点,找不到解决方案。 我想尝试使用preg_replace 将字符串转换为小写。 我只是无法创建正确的正则表达式。 原因是普通的strtolower 不支持unicode 字符。 我知道我可以使用mb_strtolower,但这个功能似乎很慢,而且不是每个人都支持 MB。

有什么线索吗?

问候, 拉德克

编辑:好的,非常感谢你们的帮助。我认为我的方法不太正确。 我认为最好使用这个:How do I detect non-ASCII characters in a string?,然后分别使用 strtolower 或 mb_strtolower(如果有)。

【问题讨论】:

  • 我是古玩,是什么让你认为正则表达式实际上比 mb_strtolower 更快?
  • 您可以使用strtolower() php函数将sting转换为小写。
  • @andreas 我不确定。基本上是想先测试一下。
  • @RukmiPatel 但你没有阅读我写的内容。你是否? ;)
  • @andreas 我做了一些测试。 preg_replace 似乎比 mb_strtolower 快 40-50 倍。但是ofc我没有把所有的规则都放好

标签: php regex unicode preg-replace


【解决方案1】:

您不应该为此使用 preg_replace,因为 preg_replace 用于匹配某个模式并将其替换为其他内容。您想要的是将每个大写字符替换为小写字符,因此无需匹配模式。

mb_strtolower 将是要走的路,如果你没有 mb_ 函数,你将不得不使用很多 str_replace 自己编写一个函数......

【讨论】:

  • 是的,但是 mb_stratolower 实在是太慢了。我做了一些测试来比较 mb_strlower 和本机 strtolower,MB 似乎比本机慢 30 倍。我最大的问题是,当时我必须做 strtolower,我不知道字符串中是否有 unicode 字符。
  • 可能先使用strtolower,然后使用preg_replace_callback 替换所有不是默认小写字符(/[^a-z]+/)的字符,然后使用mb_strtolower
  • 我来到这里是因为我正在寻找一种方法来“取消”字符串(例如,将“The War of NextGen”转为“the war of nextGen” - 所以对于这种情况,整个字符串将小写不适合我。我试图将 preg_replace 与 "/\b(\w)/" 和替换字符串一起使用 strtolower("$1") - 但它不起作用!当然应该有办法吗?
【解决方案2】:

正则表达式本身不能改变字符,它只能改变它们的顺序和/或添加额外的字符/删除其中的一些。

preg_replace_callback/e标志,但它们只能使用已知函数进行操作,因此不能比strtolower做得更好。

如果你不能依赖mb_strolower函数的存在,你将不得不自己实现它。

【讨论】:

  • 所以基本上不可能?
  • 是的,基本不可能。正则表达式是一种模式匹配和字符串重组的工具,它不能自己转换字符。
猜你喜欢
  • 2010-10-09
  • 1970-01-01
  • 2016-03-28
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多