1

I'm currently retrieving data from my database. I receive an array that contains a 'title' index with an UTF8 encoded value. What I'd like is to use this value as the name of the file in which something will be saved, so I'm doing this:

file_put_contents($filename, $content);

Where $filename is

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

Here is the code of "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);
}

My issue is that for the title "Théorie générale", I get "theeorie-geeneerale", so "e" are doubled. I guess it is something related to the charset by I cannot find a good way to avoid it. Of course, I'd like to have "theorie-generale".

Thanks

1 Answer 1

5

You need to use the unicode modifier, u, when using unicode in the regex.

So try:

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');

Demo: http://sandbox.onlinephpfunctions.com/code/3b7e5985dc23ac71a6298783d2dad646d875d3c8

Output:

theorie-generale

You could use the | (or) grouping to reduce the number of preg_replace's you have. It might make your regexs a bit harder to read though. You could also use arrays for the finds and replaces. Here's the first approach.

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');
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.