Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 改进了将字符串转换为可读URL的过程_Php_Regex_Url_Url Rewriting_Slug - Fatal编程技术网

Php 改进了将字符串转换为可读URL的过程

Php 改进了将字符串转换为可读URL的过程,php,regex,url,url-rewriting,slug,Php,Regex,Url,Url Rewriting,Slug,下面的函数重写包含各种字符的新闻和产品标题的URL。我希望创建的字符串只包含字母数字值和“-”,但不包含结尾“-”,也不包含空格和重复的“-”。下面的函数工作得很好,但我想知道是否有更简单或更高效的方法来编写它 function urlName($string) { $string = trim($string); // no open ends $string = strtolower($string);

下面的函数重写包含各种字符的新闻和产品标题的URL。我希望创建的字符串只包含字母数字值和“-”,但不包含结尾“-”,也不包含空格和重复的“-”。下面的函数工作得很好,但我想知道是否有更简单或更高效的方法来编写它

function urlName($string) {
    $string = trim($string);                          // no open ends
    $string = strtolower($string);                    // all lowercase
    $string = strtr($string, 'äöåÄÖÅ', 'aoaaoa');     // substitute umlauts
    $string = preg_replace('/[\W]+/', '-', $string);  // substitute non-word characters with -
    $string = preg_replace('/^-*|-*$/', '', $string); // no beinging or ending -
    return $string;
}
我经常这样说:

function simpleText($s) {
    $rpl = array(
        "À" => 'A', "Á" => 'A', "Â" => 'A', "Ã" => 'A', "Ä" => 'A', "Å" => 'A',
        "à" => 'a', "á" => 'a', "â" => 'a', "ã" => 'a', "ä" => 'a', "å" => 'a',
        "Ò" => 'O', "Ó" => 'O', "Ô" => 'O', "Õ" => 'O', "Ö" => 'O', "Ø" => 'O',
        "ò" => 'o', "ó" => 'o', "ô" => 'o', "õ" => 'o', "ö" => 'o', "ø" => 'o',
        "È" => 'E', "É" => 'E', "Ê" => 'E', "Ë" => 'E',
        "è" => 'e', "é" => 'e', "ê" => 'e', "ë" => 'e',
        "Ç" => 'C',
        "ç" => 'c',
        "Ì" => 'I', "Í" => 'I', "Î" => 'I', "Ï" => 'I',
        "ì" => 'i', "í" => 'i', "î" => 'i', "ï" => 'i',
        "Ù" => 'U', "Ú" => 'U', "Û" => 'U', "Ü" => 'U',
        "ù" => 'u', "ú" => 'u', "û" => 'u', "ü" => 'u',
        "Ÿ" => 'Y',
        "ÿ" => 'y',
        "Ñ" => 'N',
        "ñ" => 'n'
    );

    $s = preg_replace('`\s+`', '_', strtr($s, $rpl));
    $s = strtolower(preg_replace('`_+`', '_', preg_replace('`[^-_A-Za-z0-9]`', '', $s)));
    return trim($s, '_');
}

我认为您的代码可以压缩为:

function urlName($string) {
    $patterns = array('/^[\s-]+|[\s-]+$/', '/[\W]+/');
    $replacements = array('', '-');

    $string = strtr(strtolower($string), 'äöåÄÖÅ', 'aoaaoa');
    // or you can use:
    // $string = strtr(strtolower($string), $someTrMapping);

    return preg_replace($patterns, $replacements, $string);
}

这在这里已经被问过了,包括代码。现在正在寻找它。为什么只有umlauts可能重复?其他特殊字符,如
áèüíú
?-bažmegakapa域是没有的,因此大多数用户希望路径的行为类似-约翰·康德感谢你的链接——我认为问题有点类似,但不完全相同。他不关心包含非单词字符的名字(比如%-&等等)——迈克·贝蒂会尝试添加标签“bažmegakapa”,我实际上误读了你的评论。你对其他角色的看法也很正确。我应该提到,服务器运行的是PHP4.3,因此可能需要类似yent的转换表:(感谢您的评论。我注意到,正确的regexp过滤清空时不需要修剪。我会接受您的回答,因为我不知道您可以提供preg_replace match和replace数组,而不仅仅是单个值。感谢提供广泛的转换表。