我想有一个函数从Unicode字符串创建鼻涕虫,例如gen_slug('Andrés Cortez')应该返回andres-cortez。我该怎么做呢?


当前回答

如果你的弹头只包含A-Za-z0-9-那么这对你来说是可以的

function sanitize_slug($text)
{
    $text = preg_replace('/[^A-Za-z0-9-]+/', '-', $text);
    $text = trim($text, '-');
    $text = preg_replace('~-+~', '-', $text);
    return $text;
}

其他回答

与其用冗长的替换,不如试试下面这个:

public static function slugify($text, string $divider = '-')
{
  // replace non letter or digits by divider
  $text = preg_replace('~[^\pL\d]+~u', $divider, $text);

  // transliterate
  $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);

  // remove unwanted characters
  $text = preg_replace('~[^-\w]+~', '', $text);

  // trim
  $text = trim($text, $divider);

  // remove duplicate divider
  $text = preg_replace('~-+~', $divider, $text);

  // lowercase
  $text = strtolower($text);

  if (empty($text)) {
    return 'n-a';
  }

  return $text;
}

这是基于Symfony的Jobeet教程。

我正在使用:

function slugify($text)
{ 
    $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
    return strtolower(preg_replace('/[^A-Za-z0-9-]+/', '-', $text));
}

唯一的退路是西里尔字符将不会被转换,我现在正在寻找解决方案,不是长str_replace为每一个西里尔字符。

既然通用顶级域名和idn被越来越多地使用,我不明白为什么URL不能包含Andrés。

只是rawurlencode $URL你想要代替。大多数浏览器在url中显示UTF-8字符(不是一些古老的IE6可能)和位。Ly / goo。gl可以用来使它短的情况下,如俄语和阿拉伯语,如果需要可能是出于广告的目的,或者只是写在广告中,就像用户会写在浏览器URL。

唯一的区别是空格“”,如果你不想允许使用这些空格,那么用“-”和“/”替换它们可能是个好主意。

<?php
function slugify($url)
{
    $url = trim($url);

    $url = str_replace(" ","-",$url);
    $url = str_replace("/","-slash-",$url);
    $url = rawurlencode($url);
}
?>

Url编码 http://www.hurtta.com/RU/%D0%9F%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B/

Url写成http://www.hurtta.com/RU/Продукты/

你可以看看Normalizer::normalize(),看这里。它只需要加载PHP的intl模块

这里有一个处理特殊字符的好解决方案。

fantastic text => fantastic text

function slugify( $string, $separator = '-' ) {
    $accents_regex = '~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i';
    $special_cases = array( '&' => 'and', "'" => '');
    $string = mb_strtolower( trim( $string ), 'UTF-8' );
    $string = str_replace( array_keys($special_cases), array_values( $special_cases), $string );
    $string = preg_replace( $accents_regex, '$1', htmlentities( $string, ENT_QUOTES, 'UTF-8' ) );
    $string = preg_replace("/[^a-z0-9]/u", "$separator", $string);
    $string = preg_replace("/[$separator]+/u", "$separator", $string);
    return $string;
}

作家:Natxet