1
$fileSyntax = strtolower(preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($fileSyntax, ENT_QUOTES, 'UTF-8'))); // remove foreign character accents
$fileSyntax = preg_replace("/[^a-zA-Z0-9\s]/", "", $fileSyntax); // remove anything that's not alphanumeric, or a space
$fileSyntax = preg_replace("/\s+/", "-", $fileSyntax); // replace space with hyphen     
$fileSyntax = trim($fileSyntax, "-"); // removes prefixing and trailing hyphen

上面的代码将产生以下内容:

Pokémon = pokemon
YO MAN! = yo-man

我想重写它以提高效率,并在此后不久将其转换为函数。

我怎样才能使用多个,preg_replace()所以这不会是一个多行代码?

4

6 回答 6

1

只是让你知道,这一行:

$fileSyntax = preg_replace("/[^a-zA-Z0-9\s]/", "", $fileSyntax);

应该包括连字符,否则你会阻止人们ice-skate打字,例如,它会变成 iceskate。

$fileSyntax = preg_replace("/[^a-zA-Z0-9\s-]/", "", $fileSyntax);

空格真的应该用下划线代替(在我看来),因为连字符可以用在单词中。

您也可以为您的功能执行此操作:

function replace_chars($fileSyntax){
    return strtolower(
        preg_replace(
            array(
                "/&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);/i",
                "/[^a-zA-Z0-9\s-]/i",
                "/\s+/"
            ),
            array(
                "$1", // remove foreign character accents
                "", // remove anything that's not alphanumeric, hyphen or a space
                "_" // replace space with underscore 
            ), htmlentities($fileSyntax, ENT_QUOTES, 'UTF-8')
        )
    );
}

从技术上讲,这都是一行代码,只是间隔开,以便于阅读和理解正在发生的事情。你会打电话给它replace_chars("TeRríbLé(!) STRinG :)");应该返回terrible_string

于 2012-05-13T09:31:11.967 回答
0

您可以将 preg_replaces 作为主题参数,这样替换返回的内容将成为另一个替换的主题,依此类推...

于 2012-05-04T08:04:39.297 回答
0

我认为这个函数可以解决你的部分问题: http ://www.php.net/manual/en/function.iconv.php 它会通过替换特殊字符将你的字符串转换为另一个字符集。

于 2012-05-04T08:05:07.707 回答
0

多行代码或函数没有任何问题,阅读起来更清晰,并且与长行代码一样工作,这是因为如果某些东西是串行的,它将保持串行并且执行所需的时间将是相同的,如果你想加快进程,你可以尝试让并行线程在同一个黑板字符串上工作,但这会相当复杂(你需要解决所有冲突问题)。

于 2012-05-04T08:10:21.060 回答
0

只需使用我的超级功能:

  function text2url($chaine)
    {
    $chaine = htmlentities($chaine, ENT_NOQUOTES, 'utf-8');
    $chaine = preg_replace('#\&([A-za-z])(?:uml|circ|tilde|acute|grave|cedil|ring)\;#', '\1', $chaine);
    $chaine = preg_replace('#\&([A-za-z]{2})(?:lig)\;#', '\1', $chaine);
    $chaine = preg_replace('#\&[^;]+\;#', '', $chaine);
    $chaine = preg_replace('/[^a-zA-Z0-9_ %\[\]\.\(\)%&-]/s', '', $chaine);
    $chaine = str_replace('(', '', $chaine);
    $chaine = str_replace(')', '', $chaine);
    $chaine = str_replace('[', '', $chaine);
    $chaine = str_replace(']', '', $chaine);
    $chaine = str_replace('.', '-', $chaine);
    $chaine = trim($chaine);
    $chaine = str_replace(' ', '_', $chaine);

    return $chaine;
    }
于 2013-09-29T15:07:20.157 回答
0

还有另一种方法可以做到这一点,它只会从你的字符串中去除重音符号。我写了这个函数在我的应用程序上使用,它的语言是葡萄牙语——这意味着它有你能想象到的所有变音符号。它就像一个魅力:

function stripAccents($string){
    $accents = '/&([A-Za-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml|caron);/';
    $string_encoded = strtolower(htmlentities($string,ENT_NOQUOTES,'UTF-8'));
    return $string_encoded = preg_replace($accents,'$1',$string_encoded);

}

于 2015-10-25T19:27:44.177 回答