PHP - preg_replace和UTF8

时间:2015-07-05 17:02:45

标签: php utf-8 preg-replace

我目前正在从我的数据库中检索数据。我收到一个包含带有UTF8编码值的'title'索引的数组。我想要的是使用此值作为保存某些内容的文件的名称,所以我这样做:

file_put_contents($filename, $content);

$ filename是

'-' . $category['root'] . '-articles-' . $category['id'] . '-' . $this->Urlize($category['category'])

以下是“Urlize”的代码:

private function Urlize($value)
{
    if ($value != null && trim($value) != '')
    {
        $value = preg_replace('/([\[\(].*[\]\)])/i', '', $value);
        $value = preg_replace('/[\s]/i', '-', $value);
        $value = preg_replace('/[,!?.;:\"\'&+\/]/i', '-', $value);
        $value = preg_replace('/[-]+/i', '-', $value);
        $value = preg_replace('/(^-)/i', '', $value);
        $value = preg_replace('/-$/i', '', $value);
        $value = preg_replace('/[éèê]/i', 'e', $value);
        $value = preg_replace('/[âà]/i', 'a', $value);
        $value = preg_replace('/[öô]/i', 'o', $value);
        $value = preg_replace('/[ûùü]/i', 'u', $value);
        $value = preg_replace('/[îïíì]/i', 'i', $value);
        $value = preg_replace('/[#]/i', 'sharp', $value);
        $value = preg_replace('/[<>]/i', '-', $value);

        if ($value[strlen($value) - 1] == '-')
        {
            $value = substr($value, 0, strlen($value) - 1);
        }
    }

    return strtolower($value);
}

我的问题是,对于标题“Théoriegénérale”,我得到“theeorie-geeneerale”,所以“e”加倍。我想这是与charset相关的东西,我找不到避免它的好方法。当然,我想要“theorie-generale”。

由于

1 个答案:

答案 0 :(得分:4)

在正则表达式中使用unicode时,需要使用unicode修饰符u

所以试试:

function Urlize($value) {
    if ($value != null && trim($value) != '')
    {
        $value = preg_replace('/([\[\(].*[\]\)])/i', '', $value);
        $value = preg_replace('/[\s]/i', '-', $value);
        $value = preg_replace('/[,!?.;:\"\'&+\/]/i', '-', $value);
        $value = preg_replace('/[-]+/i', '-', $value);
        $value = preg_replace('/(^-)/i', '', $value);
        $value = preg_replace('/-$/i', '', $value);
        $value = preg_replace('/[éèê]/iu', 'e', $value);
        $value = preg_replace('/[âà]/iu', 'a', $value);
        $value = preg_replace('/[öô]/iu', 'o', $value);
        $value = preg_replace('/[ûùü]/ui', 'u', $value);
        $value = preg_replace('/[îïíì]/ui', 'i', $value);
        $value = preg_replace('/[#]/i', 'sharp', $value);
        $value = preg_replace('/[<>]/i', '-', $value);

        if ($value[strlen($value) - 1] == '-')
        {
            $value = substr($value, 0, strlen($value) - 1);
        }
    }
    return strtolower($value);
}
echo Urlize('Théorie générale');

演示:http://sandbox.onlinephpfunctions.com/code/3b7e5985dc23ac71a6298783d2dad646d875d3c8

输出:

  

theorie-兴业

您可以使用|(或)分组来减少preg_replace的数量。它可能会使你的正则表达式更难阅读。您还可以使用数组进行查找和替换。这是第一种方法。

function Urlize($value) {
    if ($value != null && trim($value) != '')
    {
        $value = preg_replace('/(([\[\(].*[\]\)])|(^-)|-$)/i', '', $value);
        $value = preg_replace('/([,!?.;:\"\'&+\/]|[\s]|[-]+|[<>])/i', '-', $value);
        $value = preg_replace('/[éèê]/iu', 'e', $value);
        $value = preg_replace('/[âà]/iu', 'a', $value);
        $value = preg_replace('/[öô]/iu', 'o', $value);
        $value = preg_replace('/[ûùü]/ui', 'u', $value);
        $value = preg_replace('/[îïíì]/ui', 'i', $value);
        $value = preg_replace('/[#]/i', 'sharp', $value);
        if ($value[strlen($value) - 1] == '-') {
            $value = substr($value, 0, strlen($value) - 1);
        }
    }
    return strtolower($value);
}
echo Urlize('Théorie générale');