URL slug与斯堪的纳维亚字母

时间:2014-04-25 09:34:03

标签: php mysql string

我发现了一个非常简洁的脚本,可以将大量文本转换为URL slug(参见第3点)。它的工作就像一个魅力,直到文本中包含以下字母之一:ÆØÅ。如果出现其中一个字母,则$ tag变为空白(之后在MySQL中没有插入任何内容)。

为什么会这样,我该如何解决?我希望如果可能的话,字母会像这样转换:Æ> ae - Ø> oe - Å> AA

(1)我的HTML字符集设置为

charset="iso-8859-1"

(2)MySQL phpmyadmin中字段的排序规则设置为

utf8_danish_ci

(3)这就是我的代码的样子:

// replace non letter or digits by -
$tag = preg_replace('~[^\\pL\d]+~u', '-', $tag);

// trim
$tag = trim($tag, '-');

// transliterate
$tag = iconv('iso-8859-1', 'UTF-8', $tag);

// lowercase
$tag = strtolower($tag);

// remove unwanted characters
$tag = preg_replace('~[^-\w]+~', '', $tag);

谢谢!

1 个答案:

答案 0 :(得分:1)

代码最后一行的正则表达式将这些字符过滤掉。 \w匹配任何字符[a-zA-Z0-9_],斯堪的纳维亚字符不属于此范围。

您提到要转换这些字符,您可以在开头使用简单的str_replace进行转换:

更新:我们还需要移动iconv

// transliterate
$tag = iconv('iso-8859-1', 'UTF-8', $tag);

$tag = str_replace(array('Æ', 'Ø', 'Å'), array('ae', 'oe', 'AA'), $tag);

// replace non letter or digits by -
$tag = preg_replace('~[^\\pL\d]+~u', '-', $tag);

// trim
$tag = trim($tag, '-');

// lowercase
$tag = strtolower($tag);

// remove unwanted characters
$tag = preg_replace('~[^-\w]+~', '', $tag);