【问题标题】:The preg_replace should not cut out wordspreg_replace 不应该删掉单词
【发布时间】:2018-10-01 18:50:05
【问题描述】:

我的代码:

$slug = preg_replace('/[^a-z0-9]+/i', '-', trim(strtolower($_POST["title"])));

例如,当我写:Úm Titulo,我得到:-m-titulo。如您所见,我错过了Ú。当我写信时:Úm Titulo。我应该得到um-titulo。如何解决? preg_replace 不应删除带有重音的单词。

【问题讨论】:

    标签: php preg-replace


    【解决方案1】:

    我认为问题在于您的正则表达式,因为它不考虑带有重音符号的字母? 参考以下:

    Replacing Accented Characters

    【讨论】:

      【解决方案2】:

      /[^a-z0-9]+/i 模式匹配 1+ 个不是 ASCII 字母和数字的字符。它匹配Яёłę 和更多字母。

      你可以使用

      preg_replace('~[\W_]+~u', '-', $s)
      

      请参阅regex demo

      这里,[\W_] 匹配任何不是 Unicode 字母或数字的字符(\W 不匹配 _,因此,_ 被添加到字符类中)。

      u modifier 使 \W 支持 Unicode。

      要将所有 Unicode 字母也更改为其基本形式,请将字符串标准化:

      $result = strtolower( preg_replace('~[\W_]+~u', '-', normalizer_normalize($text, Normalizer::NFKC)) );
      

      注意:确保 php_intl.dll 扩展已启用。

      【讨论】:

      • regex101.com/r/5jppdc/3 如您所见,preg_repace 仅在第一个单词上加上“-”,它不会将Úm 替换为um
      • @Sabrina 如果还想对字符串进行去重音,则需要使用相应的函数。仅使用正则表达式是无法实现的。
      • 这就是我需要做的一切?另一件事,我如何用你的代码替换我的代码?我的是:$slug = preg_replace('/[^a-z0-9]+/i', '-', trim(strtolower($_POST["title"])));
      • @Sabrina $slug = preg_replace('/[\W_]+/u', '-', trim(strtolower(normalizer_normalize($_POST["title"], Normalizer::NFKC))));。另外,here are hints on enabling the normalization support.
      • 我输入了Úm Titulo Muito,它输出Úm-titulo-muito,它应该输出um-titulo-muito...你忘了什么吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多