phpregexurlslug

Remove characters that aren't letters and numbers, replace space with a hyphen


I am facing an issue with URLs, I want to be able to convert titles that could contain anything and have them stripped of all special characters so they only have letters and numbers and of course I would like to replace spaces with hyphens.

How would this be done? I've heard a lot about regular expressions (regex) being used...


Solution

  • This should do what you're looking for:

    function clean($string) {
       $string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens.
    
       return preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars.
    }
    

    Usage:

    echo clean('a|"bc!@£de^&$f g');
    

    Will output: abcdef-g

    Edit:

    Hey, just a quick question, how can I prevent multiple hyphens from being next to each other? and have them replaced with just 1?

    function clean($string) {
       $string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens.
       $string = preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars.
    
       return preg_replace('/-+/', '-', $string); // Replaces multiple hyphens with single one.
    }