Clean Slug with PHP - Doing it the dirty way

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
kapoios001
Δημοσιεύσεις: 403
Εγγραφή: 17 Φεβ 2011 12:26

Clean Slug with PHP - Doing it the dirty way

Δημοσίευση από kapoios001 » 22 Αύγ 2011 08:32

Γεια σε όλους,

Αυτό το post σκοπό έχει να βοηθήσει αυτούς που ψάχνουν να βρουν κάτι παρόμοιο. Τα slugs είναι αυτά:
Εικόνα

στην γλώσσα του Web είναι αυτό που μπαίνει -συνήθως στο τέλος- του URL και είναι μια φιλική (περίληψη) προς τον χρήστη και την μηχανή αναζήτησης.

Πιο συγκεκριμένα ένα slug για ένα post με τίτλο Hello World θα μπορούσε να είναι:
my-site.com/post/1/hello-world

Ή αν είχαμε ένα άλλο άρθρο: Η Google αγοράζει το σύμπαν για $1 δισ το slug του θα μπορούσε να ήταν google-buys-universe

Γενικά, θέλουν λίγο φαντασία και όπως λέει και στο παρακάτω link δεν είναι rocket science αλλά είναι πολύ σημαντικά γιατί καθορίζουν και το page rank σας και στην σελίδα αποτελεσμάτων μπορεί ο "αντίπαλός" σας να χρησιμοποιήσε καλύτερο slug και να πήρε μια θέση πάνω από εσάς.

Κάποιοι λόγοι που τα slugs είναι σημαντικά:
  • Τα slugs επηρεάζουν το Page Rank σας
    Εφιστούν την προσοχή-ενδιαφέρον του χρήστη
Πώς να δημιουργήσετε σωστά slugs:
  • αφαιρούμε όλα τα stop words (αγγλικά: I, a, about, an, are, as, at, be, by, in, is, it, of, on, or, that, the, this, to, was, what, when, where, who, will, with, the)
Πάμε στον κώδικα:

Κώδικας: Επιλογή όλων

function clean_slug($string) {
	return str_replace&#40;array&#40;'!','@','#','$','%','^','&','*','&#40;','&#41;','_','-','+','&#123;','&#125;','\\', '<', '>', '.', ',', ' '&#41;, array&#40;'','','','','','','','','','','','','','','','', '', '', '', '', '-'&#41;, $string&#41;;
&#125;
Το function το καλούμε ως εξής:

Κώδικας: Επιλογή όλων

echo clean_slug&#40;'γεια σου'&#41;;
και θα μας εμφανίσει γεια-σου.

Αν θέλουμε να συμπεριλάβουμε διάφορα stop words τα βάζουμε στο str_replace: στο πρώτο array μπαίνουν οι λέξεις που θέλουμε να βρούμε και στο δεύτερο array μπαίνει αυτό που θα αντικαταστήσει την λέξη/χαρακτήρα που βρήκαμε. Προσέξτε στην σειρά επειδή είναι πολλά μην μπερδευτείτε.

Παράδειγμα με stop words:

Κώδικας: Επιλογή όλων

function clean_slug&#40;$string&#41; &#123;
	return str_replace&#40;array&#40;'!','@','#','$','%','^','&','*','&#40;','&#41;','_','-','+','&#123;','&#125;','\\', '<', '>', '.', ',', ' ', 'I', 'a', 'about', 'an', 'are', 'as', 'at', 'be', 'by', 'in', 'is', 'it', 'of', 'on', 'or', 'that', 'the', 'this', 'to', 'was', 'what', 'when', 'where', 'who', 'will', 'with', 'the'&#41;, array&#40;'','','','','','','','','','','','','','','','', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''&#41;, $string&#41;;
&#125;
Ο λόγος που δεν χρησιμοποίησα κάποιο από αυτά τα super-wow-zomg-clean-php-slug-url-generators είναι ότι επειδή είχαν το πλέον κορυφαίο regular expression /[^a-zA-Z0-9\/_|+ -]/ το οποίο σβήνει όλους τους ελληνικούς χαρακτήρες λες και στον κόσμο μόνο τα Αγγλικά υπάρχουν.

Φιλικά,
Γιώργος.

Άβαταρ μέλους
dimsis
Reporter
Δημοσιεύσεις: 7994
Εγγραφή: 25 Ιούλ 2001 03:00

Clean Slug with PHP - Doing it the dirty way

Δημοσίευση από dimsis » 22 Αύγ 2011 09:14

Καμιά παραλλαγή να μετατρέπει σε Latin τους Ελληνικούς χαρακτήρες (greeklish style) παίζει;
Αντί δηλαδή να γίνονται strip ή να μένουν ως έχουν, μια λύση για αυτούς που δεν θέλουν Ελληνικά στα URL είναι η μετατροπή τους σε greeklish, οπότε ένα regexp / replace για κάτι τέτοιο θα βοηθούσε.

kapoios001
Δημοσιεύσεις: 403
Εγγραφή: 17 Φεβ 2011 12:26

Clean Slug with PHP - Doing it the dirty way

Δημοσίευση από kapoios001 » 22 Αύγ 2011 09:23

Καλή ιδέα:

Κώδικας: Επιλογή όλων

<?php

function clean_slug&#40;$string&#41; &#123;
	$find = array&#40;'!','@','#','$','%','^','&','*','&#40;','&#41;','_','-','+','&#123;','&#125;','\\', '<', '>', '.', ',', ' ', 'α', 'ά', 'β', 'γ', 'δ', 'ε', 'έ', 'ζ', 'η', 'ή', 'θ', 'ι', 'ΐ', 'ί', 'κ', 'λ', 'μ', 'ν', 'ξ', 'ο', 'ό', 'π', 'ρ', 'σ', 'τ', 'υ', 'ύ', 'ΰ', 'φ', 'χ', 'ψ', 'ω', 'ώ'&#41;;

	$replace = array&#40;'','','','','','','','','','','','','','','','', '', '', '', '', '-', 'a', 'a', 'b', 'g', 'd', 'e', 'e', 'z', 'h', 'h', 'th', 'i', 'i', 'i', 'k', 'l', 'm', 'n', '3', 'o', 'o', 'p', 'r', 's', 't', 'y', 'y', 'y', 'f', 'x', 'ps', 'w', 'w'&#41;;

	return str_replace&#40;$find, $replace, $string&#41;;
&#125;

header&#40;'Content-type&#58;text/html; charset=utf-8'&#41;;
echo clean_slug&#40;'θα πάω κυρά μου στο παζάρι να σου αγοράσω ένα κοκοράκι'&#41;;

?>
εμφανίζει tha-paw-kyra-moy-sto-pazari-na-soy-agorasw-ena-kokoraki

Άβαταρ μέλους
dimsis
Reporter
Δημοσιεύσεις: 7994
Εγγραφή: 25 Ιούλ 2001 03:00

Clean Slug with PHP - Doing it the dirty way

Δημοσίευση από dimsis » 22 Αύγ 2011 10:19

Ωραίος, τώρα μπορεί να συνδυαστεί το και με μια φόρμα που όσο γράφεις σε ένα πεδίο Ελληνικούς χαρακτήρες σου τους μετατρέπει live σε latin, οπότε να χρησιμοποιηθεί και σε καμιά web app τύπου CMS, Ecommerce κλπ

Στο στυλ του να γράφω εγώ το slug που θέλω να βλέπω στο url για κάθε εγγραφή, αλλά παράλληλα να μου προτείνει και το σύστημα σε ένα preview το url βάση του τίτλου του άρθρου - προϊόντος.

Για παράδειγμα αν καταχωρώ ένα άρθρο με τίτλο "θα πάω κυρά μου στο παζάρι να σου αγοράσω ένα κοκοράκι" να μου βγάζει αυτόματα στο slug field το "tha-paw-kyra-moy-sto-pazari-na-soy-agorasw-ena-kokoraki" το οποίο εννοείται αν δεν μου κάνω μπορώ να το αλλάξω κιόλας .

kapoios001
Δημοσιεύσεις: 403
Εγγραφή: 17 Φεβ 2011 12:26

Clean Slug with PHP - Doing it the dirty way

Δημοσίευση από kapoios001 » 22 Αύγ 2011 10:43

OK έκανα και μια τέτοια περίπτωση:

Live Demo

Πώς λειτουργεί: γράφουμε στο πεδίο Τίτλος Άρθρου τον τίτλο και στο onchange event (όταν δηλαδή φύγει ο κέρσορας του ποντικιού από το πεδίο του τίτλου, δηλ. πάμε στο επόμενο πεδίο ή κάνουμε κλικ κάπου μέσα στην σελίδα), τότε αυτόματα εμφανίζεται στο πεδίο slug το αποτέλεσμα του function με ένα AJAX request και με την βοήθεια της jQuery πάει και αλλάζει το value του πεδίου.

Όταν υποβάλεις τη φόρμα βλέπει αν έχεις συμπληρώσει το πεδίο slug και σου εμφανίζει ως slug την τιμή του πεδίου. Αν δει ότι είναι κενό τότε εκτελεί το function και σου λέει πιο είναι το slug.

slug.php

Κώδικας: Επιλογή όλων

<?php

// script by George Girtsou
// http&#58;//www.ggirtsou.gr

error_reporting&#40;0&#41;;
ini_set&#40;'display_errors', false&#41;;

function clean_slug&#40;$string&#41; &#123;
	$find = array&#40;'!','@','#','$','%','^','&','*','&#40;','&#41;','_','-','+','&#123;','&#125;','\\', '<', '>', '.', ',', ' ', 'α', 'ά', 'β', 'γ', 'δ', 'ε', 'έ', 'ζ', 'η', 'ή', 'θ', 'ι', 'ΐ', 'ί', 'κ', 'λ', 'μ', 'ν', 'ξ', 'ο', 'ό', 'π', 'ρ', 'σ', 'τ', 'υ', 'ύ', 'ΰ', 'φ', 'χ', 'ψ', 'ω', 'ώ'&#41;;

	$replace = array&#40;'','','','','','','','','','','','','','','','', '', '', '', '', '-', 'a', 'a', 'b', 'g', 'd', 'e', 'e', 'z', 'h', 'h', 'th', 'i', 'i', 'i', 'k', 'l', 'm', 'n', '3', 'o', 'o', 'p', 'r', 's', 't', 'y', 'y', 'y', 'f', 'x', 'ps', 'w', 'w'&#41;;

	return str_replace&#40;$find, $replace, $string&#41;;
&#125;

header&#40;'Content-type&#58;text/html; charset=utf-8'&#41;;

$retrieve_slug = &#40;isset&#40;$_GET&#91;'retrieve_slug'&#93;&#41; && !empty&#40;$_GET&#91;'retrieve_slug'&#93;&#41;&#41; ? trim&#40;urldecode&#40;$_GET&#91;'retrieve_slug'&#93;&#41;&#41; &#58; '';
if &#40;!empty&#40;$retrieve_slug&#41;&#41; &#123;
	echo clean_slug&#40;$retrieve_slug&#41;;
	exit;
&#125;
else if &#40;isset&#40;$_POST&#91;'submit'&#93;&#41;&#41; &#123;
	$article_title = &#40;isset&#40;$_POST&#91;'article_title'&#93;&#41; && !empty&#40;$_POST&#91;'article_title'&#93;&#41;&#41; ? trim&#40;$_POST&#91;'article_title'&#93;&#41; &#58; '';
	$slug = &#40;isset&#40;$_POST&#91;'slug'&#93;&#41; && !empty&#40;$_POST&#91;'slug'&#93;&#41;&#41; ? trim&#40;$_POST&#91;'slug'&#93;&#41; &#58; '';

	if &#40;!empty&#40;$slug&#41;&#41; &#123;
		$show_slug = $slug;
	&#125;
	else &#123;
		$show_slug = clean_slug&#40;$article_title&#41;;
	&#125;
	die&#40;'Your slug is&#58; '.htmlspecialchars&#40;$show_slug&#41;&#41;;
&#125;
else &#123; ?>
<html>
<head>
	<title>Slug Generator by George Girtsou</title>
	<script src="http&#58;//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js" type="text/javascript"></script>
	<script type="text/javascript">
	$&#40;function&#40;&#41; &#123;
	&#125;&#41;;

	function GetSlug&#40;Text&#41; &#123;
	$.ajax&#40;&#123;
			 type&#58; 'GET',
			 url&#58; './slug.php',
			 data&#58; &#123;
				retrieve_slug&#58; encodeURI&#40;Text&#41;,
			  &#125; ,
			 success&#58; function&#40;data&#41; &#123;
				 $&#40;'#slug'&#41;.val&#40;data&#41;;
			 &#125;
		  &#125;&#41;
	&#125; // end GetSlug&#40;&#41; function
	</script>
</head>
<body>
<form action="./slug.php" method="post">
<h2>Slug Generator by George Girtsou</h2>
<table>
<tr>
	<td><label for="article_title">Τίτλος Άρθρου&#58;</label></td>
    <td><input id="article_title" type="text" name="article_title" value="" onchange="GetSlug&#40;this.value&#41;" /></td>
</tr>
<tr>
	<td><label for="slug">Slug&#58;</label></td>
    <td><input type="text" name="slug" id="slug" value="" /></td>
</tr>
</table>
<input type="submit" name="submit" value="Υποβολή!" />
</form>
</body>
</html>
<?php &#125; ?>

Άβαταρ μέλους
dimsis
Reporter
Δημοσιεύσεις: 7994
Εγγραφή: 25 Ιούλ 2001 03:00

Clean Slug with PHP - Doing it the dirty way

Δημοσίευση από dimsis » 22 Αύγ 2011 10:58

Εσύ είσαι γρήγορος :)
Μπορεί να γίνει και στο keypress και χωρίς να το επιβαρύνεις με ajax call.
Σε κάθε χτύπημα πλήκτρου μπορείς να καλείς την function σου και να δημιουργεί live το slug string + να αλλάζει το value του προτεινόμενου slug πεδίου στη φόρμα. :wink:

kapoios001
Δημοσιεύσεις: 403
Εγγραφή: 17 Φεβ 2011 12:26

Clean Slug with PHP - Doing it the dirty way

Δημοσίευση από kapoios001 » 22 Αύγ 2011 11:00

Ναι στην αρχή έτσι το είχα κάνει αλλά μετά λέω καλύτερα στο onchange γιατί κάνεις λιγότερα requests στον server (όχι ότι θα γινόταν overload από αυτό).

Στο wordpress έτσι το έχουν. Κάτι θα ξέρουν για να το κάναν έτσι.

Τι ακριβώς εννοείς χωρίς να το επιβαρύνεις με ajax call? Να μετατραπεί ο κώδικας και να τρέχει με javascript function?

Άβαταρ μέλους
dimsis
Reporter
Δημοσιεύσεις: 7994
Εγγραφή: 25 Ιούλ 2001 03:00

Clean Slug with PHP - Doing it the dirty way

Δημοσίευση από dimsis » 22 Αύγ 2011 11:13

Ναι, όλο το function για το replace μπορεί να γίνει με javascript οπότε μετά δεν σε χαλάει να αλλάζει το slug ανά keypress και έχεις τελικά στο προτεινόμενο form field και έτοιμο το slug.
Με αυτόν τον τρόπο θα φαίνεται live η μετατροπή και δεν θα χρειάζεσαι ajax call (εκτός και αν θέλεις να δημιουργείς και php variable και δεν σου φτάνει το value του πεδίου που ούτως ή άλλως αυτό θα γίνει μετά submit)

kapoios001
Δημοσιεύσεις: 403
Εγγραφή: 17 Φεβ 2011 12:26

Clean Slug with PHP - Doing it the dirty way

Δημοσίευση από kapoios001 » 22 Αύγ 2011 11:14

Όπως προτιμάει ο καθένας.

Άβαταρ μέλους
dimsis
Reporter
Δημοσιεύσεις: 7994
Εγγραφή: 25 Ιούλ 2001 03:00

Clean Slug with PHP - Doing it the dirty way

Δημοσίευση από dimsis » 22 Αύγ 2011 11:22

Ναι ναι ακριβώς.
Ευχαριστούμε που μοιράστηκες τον κώδικα, έχει προταθεί για βοήθημα.

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Clean Slug with PHP - Doing it the dirty way

Δημοσίευση από cherouvim » 22 Αύγ 2011 11:39

Ωραίος.

Σου λείπει το "ς" και κάποια φωνήεντα με διαλυτικά.

kapoios001
Δημοσιεύσεις: 403
Εγγραφή: 17 Φεβ 2011 12:26

Clean Slug with PHP - Doing it the dirty way

Δημοσίευση από kapoios001 » 22 Αύγ 2011 18:17

OK έβαλα και κάποια ακόμα που έλειπαν:

Κώδικας: Επιλογή όλων

function clean_slug&#40;$string&#41; &#123;
	$find = array&#40;'!','@','#','$','%','^','&','*','&#40;','&#41;','_','-','+','&#123;','&#125;','\\', '<', '>', '.', ',', ' ', 'α', 'ά', 'β', 'γ', 'δ', 'ε', 'έ', 'ζ', 'η', 'ή', 'θ', 'ι', 'ϊ', 'ΐ', 'ί', 'κ', 'λ', 'μ', 'ν', 'ξ', 'ο', 'ό', 'π', 'ρ', 'σ', 'τ', 'υ', 'ύ', 'ΰ', 'ϋ', 'φ', 'χ', 'ψ', 'ω', 'ώ', 'ς'&#41;;

	$replace = array&#40;'','','','','','','','','','','','','','','','', '', '', '', '', '-', 'a', 'a', 'b', 'g', 'd', 'e', 'e', 'z', 'h', 'h', 'th', 'i', 'i', 'i', 'i', 'k', 'l', 'm', 'n', '3', 'o', 'o', 'p', 'r', 's', 't', 'y', 'y', 'y', 'y', 'f', 'x', 'ps', 'w', 'w', 's'&#41;;

	return str_replace&#40;$find, $replace, $string&#41;;
&#125;
Ελπίζω να μην ξέχασα κάτι.

kapoios001
Δημοσιεύσεις: 403
Εγγραφή: 17 Φεβ 2011 12:26

Clean Slug with PHP - Doing it the dirty way

Δημοσίευση από kapoios001 » 24 Αύγ 2011 22:36

FIX (όχι η μπύρα):

Κώδικας: Επιλογή όλων

function clean_slug&#40;$string&#41; &#123;
	$find = array&#40;'!','@','#','$','%','^','&','*','&#40;','&#41;','_','-','+','&#123;','&#125;','\\', '<', '>', '.', ',', ' ', 'α', 'ά', 'β', 'γ', 'δ', 'ε', 'έ', 'ζ', 'η', 'ή', 'θ', 'ι', 'ϊ', 'ΐ', 'ί', 'κ', 'λ', 'μ', 'ν', 'ξ', 'ο', 'ό', 'π', 'ρ', 'σ', 'τ', 'υ', 'ύ', 'ΰ', 'ϋ', 'φ', 'χ', 'ψ', 'ω', 'ώ', 'ς'&#41;;

	$replace = array&#40;'','','','','','','','','','','','','','','','', '', '', '', '', '-', 'a', 'a', 'b', 'g', 'd', 'e', 'e', 'z', 'h', 'h', 'th', 'i', 'i', 'i', 'i', 'k', 'l', 'm', 'n', '3', 'o', 'o', 'p', 'r', 's', 't', 'y', 'y', 'y', 'y', 'f', 'x', 'ps', 'w', 'w', 's'&#41;;

	$string = mb_strtolower&#40;$string, 'UTF-8'&#41;;
	return str_replace&#40;$find, $replace, $string&#41;;
&#125;
Αυτό που παρατήρησα είναι ότι όταν χρησιμοποιούμε κεφαλαία δεν τα κάνει σε greeklish όπως και είναι λογικό αφού δεν έχουμε βάλει τα γράμματα σε κεφαλαία.

Έκανα λοιπόν ένα quick fix το οποίο κάνει όλα τα γράμματα μικρά και έτσι δεν χρειάζεται να τα γράφουμε μικρά και κεφαλαία στο php function.

Κανονικά θα χρησιμοποιούσαμε το strtolower() function που μετατρέπει όλους τους χαρακτήρες από κεφαλαία σε μικρά αλλά θα είχαμε πρόβλημα με την κωδικοποίηση.

Το πρόβλημά μας λύνεται με το mb_strtolower() function το οποίο δέχεται encoding.

Κώδικας: Επιλογή όλων

	$string = mb_strtolower&#40;$string, 'UTF-8'&#41;;
Έτσι το function δουλεύει καλύτερα.

http://gr.php.net/manual/en/function.mb-strtolower.php (δείτε το παράδειγμα 2)

Κώδικας: Επιλογή όλων

<?php
$str = "Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός";
$str = mb_strtolower&#40;$str, 'UTF-8'&#41;;
echo $str; // Prints τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός
?>
Γιώργος.

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες