SEO URL上的PHP preg_replace没有给出预期的结果

时间:2011-04-03 09:54:05

标签: php url seo preg-replace character

所以,我有这个方法:

$seo_special = array("ä", "õ", "ö", "ü", "Ä", "Õ", "Ö", "Ü");
$seo_special_replace = array("a", "o", "o", "u", "a", "o", "o", "u");
$seo_tag_a2b = str_replace($seo_special, $seo_special_replace, $row->name);
$seo_tag_a2b = preg_replace('/[^a-z0-9-]/i', '', strtolower(str_replace(' ', '-', trim($seo_tag_a2b))));

我希望它能将特殊字符替换为普通字符,但不知何故,它会跳过这些字符,Põrandalaud/ Liistparkett 的结果是 prandalaud - liistparkett 应该是 porandalaud - liistparkett ,我不知道我做错了什么。任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:2)

您可以使用iconv将奇怪的字符转换为仅ASCII字符。

setlocale(LC_ALL, 'en_US.UTF8');
function toAscii($str, $replace=array(), $delimiter='-') {
    if( !empty($replace) ) {
        $str = str_replace((array)$replace, ' ', $str);
    }

    $clean = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
    $clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean);
    $clean = strtolower(trim($clean, '-'));
    $clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean);

    return $clean;
}

测试:

echo toAscii("Mess'd up --text-- just (to) stress /test/ ?our! `little` \\clean\\ url fun.ction!?-->");
returns: messd-up-text-just-to-stress-test-our-little-clean-url-function

echo toAscii("Perché l'erba è verde?", "'"); // Italian
returns: perche-l-erba-e-verde

echo toAscii("Peux-tu m'aider s'il te plaît?", "'"); // French
returns: peux-tu-m-aider-s-il-te-plait

echo toAscii("Tänk efter nu – förr'n vi föser dig bort"); // Swedish
returns: tank-efter-nu-forrn-vi-foser-dig-bort

echo toAscii("ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöùúûüýÿ");
returns: aaaaaaaeceeeeiiiidnooooouuuuyssaaaaaaaeceeeeiiiidnooooouuuuyy

echo toAscii("Custom`delimiter*example", array('*', '`'));
returns: custom-delimiter-example

echo toAscii("My+Last_Crazy|delimiter/example", '', ' ');
returns: my last crazy delimiter example

The perfect PHP clean url generator的方法和信用

为了帮助你进行谷歌搜索,你可以搜索'url slug php'。

答案 1 :(得分:0)

这可能是您的PHP源文件的字符编码与您正在处理的字符串的不匹配。

确保它们中的两个匹配。如果您正在处理UTF-8数据,则需要确保PHP文件也存储在UTF-8中。否则,特殊字符将具有其他字节值,与$row->name中的字符值不匹配。