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


当前回答

更新

由于这个答案引起了一些关注,我在这里添加了一些解释。

所提供的解决方案基本上将用-(连字符)替换除A-Z、A-Z、0-9和-(连字符)之外的所有内容。因此,它不能与其他unicode字符(URL段码/字符串的有效字符)正常工作。一种常见的情况是输入字符串包含非英语字符。

只有当您确信输入字符串不会包含unicode字符时才使用此解决方案,您可能希望这些字符成为output/slug的一部分。

如。“नारीशक्ति”将成为 "----------" ( 连字符)而不是“नारी——शक्ति”(有效的URL蛞蝓)。

回答

$slug = strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', $string)));

其他回答

Vous pouvez cette function pour transformer ton title en url
function slug($string, $delimiter = '-') {
    $oldLocale = setlocale(LC_ALL, '0');
    setlocale(LC_ALL, 'en_US.UTF-8');
    $clean = iconv('UTF-8', 'ASCII//TRANSLIT', $string);
    $clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean);
    $clean = strtolower($clean);
    $clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean);
    $clean = trim($clean, $delimiter);
    setlocale(LC_ALL, $oldLocale);
    return $clean;
}

我认为最优雅的方法是使用Behat\Transliterator\Transliterator。

我需要通过你的类扩展这个类,因为它是一个抽象,一些像这样:

<?php
use Behat\Transliterator\Transliterator;

class Urlizer extends Transliterator
{
}

然后,使用它:

$text = "Master Ápiu";
$urlizer = new Urlizer();
$slug = $urlizer->transliterate($slug, "-");
echo $slug; // master-apiu

当然你也应该把这些东西放到你的作曲器里。

composer require behat/transliterator

更多信息请点击这里https://github.com/Behat/Transliterator

下面是制作鼻涕虫的简单方法

function convertURLs($value){
$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', $value))))), $delimiter));
return $slug;}

我根据梅林的回答写了这篇文章。无论页面上的字符编码如何,此函数都将正常工作。它也不会把单引号变成破折号:)

function slugify ($string) {
    $string = utf8_encode($string);
    $string = iconv('UTF-8', 'ASCII//TRANSLIT', $string);   
    $string = preg_replace('/[^a-z0-9- ]/i', '', $string);
    $string = str_replace(' ', '-', $string);
    $string = trim($string, '-');
    $string = strtolower($string);

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

    return $string;
}

我正在使用:

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

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