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


当前回答

如果你安装了intl扩展,你可以使用Transliterator::transliterate函数轻松创建一个slug。

$string = 'Namnet på bildtävlingen';

$rules = <<<'RULES'
    :: Any-Latin;
    :: NFD;
    :: [:Nonspacing Mark:] Remove;
    :: NFC;
    :: [^-[:^Punctuation:]] Remove;
    :: Lower();
    [:^L:] { [-] > ;
    [-] } [:^L:] > ;
    [-[:Separator:]]+ > '-';
RULES;

$slug = \Transliterator::createFromRules($rules)
    ->transliterate( $string );

echo $slug; // namnet-pa-bildtavlingen

demo

请注意,这种解决方案适用于任何字母表,并且非常灵活。

其他回答

使用由许多高级开发人员支持的现有解决方案总是一个好主意。最流行的是https://github.com/cocur/slugify。首先,它支持多种语言,并且正在不断更新。

如果您不想使用整个包,您可以复制所需的部分。

既然通用顶级域名和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/Продукты/

对于标准的字母数字英语-没有复杂。

/**
 * Update the provided string to a slug-safe format.
 *
 * @param string $string
 * @return string
 */
function slugify($string)
{
    return strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', $string), '-'));
}

如果使用Core中已经实现的东西呢?

//Clean non UTF-8 characters    
Mage::getHelper('core/string')->cleanString($str)

或者核心url/ url重写方法之一..

对我来说,这个变体是完美的,它也改变&和。下面是代码:

function dSlug($string) {
    return strtolower(trim(preg_replace('~[^0-9a-z]+~i', '-', html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1',htmlentities(preg_replace('/[&]/', ' and ', $title), ENT_QUOTES, 'UTF-8')), ENT_QUOTES, 'UTF-8')), '-'));
}`