PHP将字符串转换为slug

PHP将字符串转换为slug,php,string,Php,String,将字符串转换为slug的最佳方式是什么?意思是: 允许使用字母,转换为小写 数字是允许的 应消除空格,而不是转换为短划线(“-”) 用等效标准字母替换重音字符 不允许有其他字符,应去掉 我在网上找到了很多代码,但都倾向于将空格转换为破折号,这是我不想做的 我还对改变转换感兴趣,其中: 符号(&)应替换为字符串“and” 以及一种变体,其中: 不必费心将重音字符转换为等效的标准字母 这是我最初在这里找到的一个修改过的函数()。您可以将'作为分隔符传递,以不使用'-' public sta

将字符串转换为slug的最佳方式是什么?意思是:

  • 允许使用字母,转换为小写
  • 数字是允许的
  • 应消除空格,而不是转换为短划线(“-”)
  • 用等效标准字母替换重音字符
  • 不允许有其他字符,应去掉
我在网上找到了很多代码,但都倾向于将空格转换为破折号,这是我不想做的

我还对改变转换感兴趣,其中:

  • 符号(&)应替换为字符串“and”
以及一种变体,其中:

  • 不必费心将重音字符转换为等效的标准字母

    • 这是我最初在这里找到的一个修改过的函数()。您可以将
      '
      作为分隔符传递,以不使用
      '-'

      public static function createSlug($str, $delimiter = '-'){
      
          $slug = strtolower(trim(preg_replace('/[\s-]+/', $delimiter, preg_replace('/[^A-Za-z0-9-]+/', $delimiter, preg_replace('/[&]/', 'and', preg_replace('/[\']/', '', iconv('UTF-8', 'ASCII//TRANSLIT', $str))))), $delimiter));
          return $slug;
      
      } 
      

      前一个是很好的解决方案。但不幸的是,它切断了像ć或ż这样的特定字母。 如果您想保留它们,那么:

      public static function createSlug($str, $delimiter = '-'){
      
          $unwanted_array = ['ś'=>'s', 'ą' => 'a', 'ć' => 'c', 'ç' => 'c', 'ę' => 'e', 'ł' => 'l', 'ń' => 'n', 'ó' => 'o', 'ź' => 'z', 'ż' => 'z',
              'Ś'=>'s', 'Ą' => 'a', 'Ć' => 'c', 'Ç' => 'c', 'Ę' => 'e', 'Ł' => 'l', 'Ń' => 'n', 'Ó' => 'o', 'Ź' => 'z', 'Ż' => 'z']; // Polish letters for example
          $str = strtr( $str, $unwanted_array );
      
          $slug = strtolower(trim(preg_replace('/[\s-]+/', $delimiter, preg_replace('/[^A-Za-z0-9-]+/', $delimiter, preg_replace('/[&]/', 'and', preg_replace('/[\']/', '', iconv('UTF-8', 'ASCII//TRANSLIT', $str))))), $delimiter));
          return $slug;
      }
      

      所以
      你想让你的url看起来像这样,而不是看起来更干净的
      你想让你的url看起来像这样吗?另外,
      重音字符被等效的标准字母替换
      ,但是
      不必费心转换重音字符
      。哪一个?选择一个接近您想要的解决方案,然后修改它以添加您的特殊要求。您只需删除标准段塞生成器结果中的所有破折号即可。有类似或的库允许您自定义字符翻译和分隔符。@ausi,太棒了。谢谢。这不是一个优雅的片段
      preg_replace()
      可以接收一个查找/替换数组,因此在调用中嵌套调用会不必要地增加行数
      &
      不需要用大括号括起来——对单个符号使用字符类没有好处。