Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Best way to convert title into url compatible mode in PHP?

Tags:

url

php

http://domain.name/1-As Low As 10% Downpayment, Free Golf Membership!!!

The above url will report 400 bad request,

how to convert such title to user friendly good request?

like image 361
user198729 Avatar asked Feb 10 '10 03:02

user198729


4 Answers

See the first answer here URL Friendly Username in PHP?:

function Slug($string)
{
    return strtolower(trim(preg_replace('~[^0-9a-z]+~i', '-', html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8')), ENT_QUOTES, 'UTF-8')), '-'));
}

$user = 'Alix Axel';
echo Slug($user); // alix-axel

$user = 'Álix Ãxel';
echo Slug($user); // alix-axel

$user = 'Álix----_Ãxel!?!?';
echo Slug($user); // alix-axel
like image 182
John Conde Avatar answered Sep 20 '22 09:09

John Conde


I just create a gist with a useful slug function:

https://gist.github.com/ninjagab/11244087

You can use it to convert title to seo friendly url.

<?php
class SanitizeUrl {

    public static function slug($string, $space="-") {
        $string = utf8_encode($string);
        if (function_exists('iconv')) {
            $string = iconv('UTF-8', 'ASCII//TRANSLIT', $string);
        }

        $string = preg_replace("/[^a-zA-Z0-9 \-]/", "", $string);
        $string = trim(preg_replace("/\\s+/", " ", $string));
        $string = strtolower($string);
        $string = str_replace(" ", $space, $string);

        return $string;
    }
}

$title = 'Thi is a test string with some "strange" chars ò à ù...';
echo SanitizeUrl::slug($title);
//this will output:
//thi-is-a-test-string-with-some-strange-chars-o-a-u
like image 42
Gabriele F. Avatar answered Sep 20 '22 12:09

Gabriele F.


You may want to use a "slug" instead. Rather than using the verbatim title as the URL, you strtolower() and replace all non-alphanumeric characters with hyphens, then remove duplicate hyphens. If you feel like extra credit, you can strip out stopwords, too.

So "1-As Low As 10% Downpayment, Free Golf Membership!!!" becomes:

as-low-as-10-downpayment-free-gold-membership

Something like this:

function sluggify($url)
{
    # Prep string with some basic normalization
    $url = strtolower($url);
    $url = strip_tags($url);
    $url = stripslashes($url);
    $url = html_entity_decode($url);

    # Remove quotes (can't, etc.)
    $url = str_replace('\'', '', $url);

    # Replace non-alpha numeric with hyphens
    $match = '/[^a-z0-9]+/';
    $replace = '-';
    $url = preg_replace($match, $replace, $url);

    $url = trim($url, '-');

    return $url;
}

You could probably shorten it with longer regexps but it's pretty straightforward as-is. The bonus is that you can use the same function to validate the query parameter before you run a query on the database to match the title, so someone can't stick silly things into your database.

like image 22
cbednarski Avatar answered Sep 21 '22 09:09

cbednarski


You can use urlencode or rawurlencode... for example Wikipedia do that. See this link: http://en.wikipedia.org/wiki/Ichigo_100%25

that's the php encoding for % = %25

like image 1
Gmi182 Avatar answered Sep 23 '22 09:09

Gmi182