Archives par mot-clé : regex

Mysql et la recherche : avec REGEXP

Publié dans SQL | 6 commentaires

Dans un précédent billet, on a vu comment effectuer une recherche assez poussée en MySQL avec LIKE. Mais LIKE n’est vraiment rien comparée à ce que l’on peut faire avec REGEXP OU RLIKE (RLIKE est un alias pour REGEXP. Il a été créé pour un souci de similitude avec mSQL). Et en même temps, je trouve que LIKE suffit la plupart du temps… REGEXP permet d’utiliser les expressions régulières pour retrouver une chaine de caractères dans une table SQL. Il existe 2 types de regex en PHP (petit nom des expressions régulières ^^) :

  • PCRE : issue du langage Perl, ces regex sont réputées difficiles, mais sont rapides et performantes
  • POSIX : mise en avant avec le PHP, ces regex se veut un peu plus simple que les PCRE, elles sont néanmoins moins performantes. MySQL utilise ce type de regex.

Sur son tutoriel de PHP, M@téo21 explique le fonctionnement des regex PCRE pour PHP. Si on comprend les PCRE, on comprend les POSIX, donc si vous n’y connaissez rien en regex, je vous conseille de lire son cours à ce sujet, il est particulièrement bien fait : Cours sur les regex de M@téo21.

Utiliser REGEXP

Une fois que l’on maitrise les regex (voir ci-dessous), utiliser REGEXP n’est pas un problème. Un exemple :

SELECT * FROM table WHERE champ REGEXP "<regex>"

Continuer la lecture

Les jours où l’on déteste IE

Publié dans Geekeries | Laisser un commentaire

Le jour où l’on déteste IE c’est par exemple le jour où l’on découvre que pour utiliser des répertoires virtuels avec de l’url-rewriting (ex. : pages/page-magique.html redirige vers index.php?id=15 alors que le dossier pages/ n’existe pas), il ne faut pas mettre de slashs à la fin de l’url de base dans @@ ///

Lire un fichier CSV (Excel) avec PHP

Publié dans PHP | Un commentaire

Je viens de découvrir 2 petites fonctions PHP bien utiles pour s’occuper d’un fichier Excel. (ou équivalent) Si vous avez déjà essayé de traiter un fichier Excel avec PHP, vous savez sûrement qu’il faut préalablement enregistrer ce fichier au format CSV (Comma-Separated Values), vos colonnes sont alors séparées par des points virgules ( ; ) et vos lignes par un retour à la ligne. Donc un fichier CSV ressemble à ceci :
case1;case2;"case 3 avec des espaces";case4
case5;case6;"case 7 avec des espaces";case8

A partir de la, au premier abord, on s’apprête à utiliser des regex (preg_match_all par exemple) pour lire le fichier, mais ce serait perdre un peu de temps pour pas grand chose. En effet, il existe 2 fonctions pour lire et écrire un fichier CSV en PHP : fgetcsv et fputcsv.
Continuer la lecture

Documentation d’un module toolbar en PHP objet

Publié dans Projets | Laisser un commentaire

Je parle ici d’une toolbar, ou BBcodeBar, permettant d’utiliser facilement du BBcode (du BNcode pour être précis) lorsque l’on écrit un article ou que l’on poste sur un forum, un commentaire… (que sais-je encore !) Bref, quelque chose qui ressemble à ça :
Exemple de toolbar
Voilà déjà pas mal de temps que j’utilise la même toolbar sur mes sites Internet. C’est une toolbar que j’ai créé et qui est basé sur une mod conçue à l’origine pour le système de forum FluxBB (ex-PunBB) par Vin100. A chaque fois, je la modifie et je galère pour l’intégrer correctement au site du momenet, et surtout je me retape tout le travail dès que je dois modifier quelque chose. Voilà pourquoi depuis quelques jours, quand l’envie me prend, je développe une version PHP objet de cette toolbar de façon à la rendre plus portable, plus paramétrable et aussi plus performante. J’approche désormais de la fin, et donc de la première publication d’une version 1. Voici donc un premier jet de documentation, entre autre, pour vérifier que rien n’a été oublié.

But

  • Créer une toolbar permettant d’utiliser facilement du BBcode (user friendly)
  • Créer un système de gestion de toolbars complet et paramètrable : génération de plusieurs toolbars, paramétrage du contenu des toolbars, désactivable ou désinstalable en 1 clic (surtout coder friendly)
  • Mettre en pratique mes connaissances en PHP objet, et améliorer celles en Javascript

Continuer la lecture

Tout ce qu’il faut savoir pour crawler tranquilement

Publié dans PHP | Laisser un commentaire

Ah, avant toute chose qu’est-ce que j’entends par le mot « crawler » ? On pourrait appeler ça « scrapper », « looter », voir même « pirater ». En fait l’idée est de créer un petit programme dont le but va être de récupérer des informations sur un site Web qui se trouve en ligne (ou pas). Exactement comme fait le GoogleBot ou les autres robots de moteurs de recherche. Et comme font aussi les robots qui cherchent des adresses e-mails pour faire du spam… Bref, on voit qu’il peut y avoir un petit problème éthique derrière le scrolling, mais c’est une discipline qui peut être tout à fait noble et utile autant pour le crawleur que pour le crawlé. Mais je ne vais pas faire de débat philosophique, plutôt parler technique.
Durant le stage que j’effectue actuellement, j’ai pas mal l’occasion de crawler des sites Web, voici donc un résumé de fonctions ou de techniques qui peuvent être utiles.

Le crawling en résumé

L’idée principale est de faire automatiquement rapidement ce que l’on aurait dû faire à la main en mettant beaucoup de temps. Pour cela, on fait une petite étude des urls du site que l’on souhaite crawler. Par exemple, si c’est une liste d’article, les pages de chaque article auront peut-être un url avec quelque chose du genre : article.php?id=1452112. A partir de la :

 $url = 'article.php?id={id}'; for($i=1; $i<=$nbArticle; $i++) {
	$urlAScroller = str_replace('{id}', $i, $url);
	$content = file_get_contents($urlAScroller);
	// Regex et explode sur $content pour récupérer les informations souhaitées }

Continuer la lecture

Coloration syntaxique du code sous Dotclear

Publié dans Dotclear | Un commentaire

Un autre titre aurait pu être : Comment tu fais pour [que] le code PHP il soit tout joli en couleur et tout Oo ! (comme l’a si bien dit j-b)
En fait, c’est assez simple il suffit de faire un tour sur le site officiel de Dotclear et de télécharger le plugin SyntaxeHl. Reste à l’installer dans l’administration (Système > Extensions > Installer ou mettre à jour une extension) en uploadant directement le fichier ZIP du plugin.
Gestion des extensions
Reste encore à activer le plugin (si besoin) dans le gestionnaire d’extensions (Système > Extensions > Gestion des extensions), et dans les paramètres du blog (Tableau de bord > Paramètre du blog > tout en bas) : et voilà le travail !
Lorsque vous utilisez la syntaxe Wiki, il vous suffit alors de faire précéder votre code par ///[nom du langage en minuscule] et de la faire suivre par ///.

Lorsque vous utilisez la syntaxe XHTML, en théorie c’est < nom du langage en minuscule >< / nom du langage en minuscule >, mais moi ça ne fonctionnait pas. (c’est une des raisons qui me pousse à utiliser la syntaxe Wiki)

Un petit exemple ?
///[ php ]
$var = 'PHP';
echo 'Ceci est du code '.$var;
///

donne

$var = 'PHP';
echo 'Ceci est du code '.$var;

Une fonction regex bien utile : preg_match_all

Publié dans PHP | 2 commentaires

J’avais utilisé cette fonction il y quelques temps et je n’arrivais à mettre la main dessus. preg_match_all() est très pratique lorsque l’on souhaite récupèrer plusieurs données d’un seul coup. Que fait-elle en gros ? On lui fournit un pattern (comme pour une regex classique, c’est le patron de ce que l’on cherche), une chaine de caractères dans laquelle effectuer la recherche, un array dans lequel on mettra les données et des options si besoin.

  • Dans la case 0 de l’array de retour, on aura un array avec toutes les chaines de caractères correspondant au pattern. (ce qui correspond au $0)
  • Dans la case 1 de l’array de retour, on aura un array avec tous les $1 de chaque chaines de caractères correspondant au pattern.
  • Dans la case 2, de l’array de retour, on aura un array avec tous les $2, … et ainsi de suite.

Exemple

Dans ma variable $content, j’ai le contenu suivant :

Nom : Duck, Prénom : Donald;
Nom : Mouse, Prénom : Mickey;
Nom : Duck, Prénom : Daisy;

Pour récupèrer les noms et prénoms de chacun des personnages, je peux donc utiliser la regex suivante :

preg_match_all('!Nom : ([^,]+), Prénom : ([^,]+);\n!isU', $content, $out, PREG_PATTERN_ORDER);

Affichons l’array de retour à l’arrache pour voir le résultat :

echo '<pre>'; print_r($out); echo '<pre><br />';

On voit bien que l’on un array avec des sous array content $0, $1, etc. On peut donc afficher noms et prénoms (ou les enregistrer dans une base de données si l’on préfère) de la manière suivante :

$nb = count($out[0]); for($i=0; $i<$nb; $i++) { 
	echo 'Patron : '.$out[0][$i].'<br />'; 
	echo $out[1][$i].' '; 
	echo $out[2][$i].'<br />';
}

Tout ceci nous évite d’utiliser plein de preg_replace() couplés avec un petit explode(). Quand c’est possible, c’est tout de même bien plus simple avec preg_match_all(). Bon, comme ça, je suis sûr de ne plus oublier cette petite fonction bien pratique.

Du BBcode en PHP sans regex

Publié dans PHP | Laisser un commentaire

Alors parait-il que l’on pourrait faire du BBcode en PHP sans utiliser du tout de regex, et ce grâce à une l’extension PECL nommée BBcode et qui ferait partie (en théorie) du module PHP standart depuis PHP 5.2.0. Bon en pratique j’ai PHP 5.2.8 (en local avec Easy PHP, eh oui j’suis sous Windows en ce moment) et je n’ai pas du tout cette extension. Et puis sur le site de téléchargement du package il n’y a que des packages pour Linux (et pour des raisons diverses et variées je n’ai pas accès à Linux pour l’instant. Misère…).
Bref, je suis un peu déçu, j’aurai bien aimé tester. Mais le manuel nous dit tout ce qu’il faut faire : Extension PHP BBcode. Y parait que c’est beaucoup plus rapide que de coder son BBcode avec des regex, et en plus ça à l’air très simple à mettre en place. Bon par contre, je suppose qu’on ne peut pas configurer tout comme on le souhaite, mais passons pour l’instant. En théorie :

  • On créé une structure de BBcode avec bbcode_create() et on peut ensuite ajouter des balises avec bbcode_add_element() si on en a oublié, ou même des smilies avec bbcode_add_smiey().
  • Reste à utiliser bbcode_parse() pour parser une chaine de caractère en transformant par exemple [b]test[/b] par test, et donc pour mettre le mot « test » en gras.
  • Puis bbcode_destroy() pour libérer proprement notre structure de BBcode.

Voilà pour la théorie ! Dès que j’ai réussi à tester la bête, j’essaierai de voir ce que ça peut donner en pratique !

L’url rewriting c’est le bien

Publié dans Apache | Laisser un commentaire

L’url rewriting, cette technique qui consiste à créer des pages virtuelles avec un url tout mignon et qui redirige vers de vraies pages avec un url tout moche, est particulièrement intéressante pour 2 raisons :

  • Se faire bien voir des moteurs de recherches. L’url est très utilisé par les robots d’indexation, par conséquent, si elle contient déjà des mots clefs importants, c’est tout bon !
  • Améliorer l’expérience de ses visiteurs. En effet, on est plus enclin à cliquer sur un lien http://exemple.fr/presentation-url-rewriting.html que sur http://exemple.fr/index.php?id=1254879, tout simplement parce que l’on sait, a priori, de quoi est censé parler la page sur lequel on va se diriger.

Pour réécrire ses urls, il suffit de créer un fichier .htaccess à la racine de son serveur et d’y écrire quelques lignes pour expliquer à Apache comment rediriger certaines pages. Quelques connaissances en expressions régulières peuvent servir ! Et il faut que le mode url-rewriting de votre serveur Apache soit activé. (ce qui n’est pas le cas partout, mais il y a des techniques pour réécrire quand même ses urls, notamment sur un serveur hébergé par Free) Et ce fichier .htaccess peut ressembler à ça :

RewriteEngine on RewriteBase /site/front ################################################################################
#
# REDIRECTION DES PAGES VIRTUELLES RATTACHEES A DES RUBRIQUES : 
#
#	Exemple de redirection: scooter-rouge_15.php => index.php?id=15 
#
#	PS: 1.	Le - (tiret) sert à séparer les mots dans un nom de page
#		Le _ (underscore) sert à distinguer la page de la rubrique.
#		Exemple: scooter-rouge-08_15.php OU scooter-rouge-fiche_15.php
#
#            2.	Sur certain serveur d'hebergement, il faut forcer l'ajout de "/"
#		devant la 2éme partie des régles: /index.php?id=$2 [L]
#
# Solution : tester avec la règle située à la fin de ce fichier
# ################################################################################
# Règles pour l'affichage des pages articles
RewriteRule ^([a-z,A-Z,0-9,\-]+).html$ index.php?RID=10&kw=$1 [L]

Cela étant dit, je pense que la meilleur manière de réécrire des urls est d’utiliser le titre de la page et seulement le titre de la page. Je m’explique en prenant comme exemple une page index.php?id=42 qui a pour titre (titre de la page, ou titre d’un article) « Hello Word! » :

  • La méthode la plus courante est d’utiliser la forme suivante : hello-world_42.html. C’est déjà pas mal, et c’est même plus que bien ! C’est de loin ce qu’il y a de plus simple aussi.
  • La méthode la plus performante mais légèrement plus délicate à mettre en place est d’utiliser la forme qui suit : hello-world.html. Pour la mettre en place, il suffit d’enregistrer le titre rewrité de chacune de ses pages dans sa base de données. Ces titres rewrités remplacent alors les id des pages. Et puis voilà, le tour est joué ! Bien sûr, pour éviter que 2 pages ayant un titre identique pointent vers le même lien, il est nécessaire que la fonction de rewritage du titre se charge de vérifier que ce dernier n’existe pas encore, et si ce n’était pas le cas, de lui ajouter un id ou je ne sais quoi. Bref, l’idée est là ! Et tant qu’à faire, cette fonction de parsage se chargera de supprimer ou de remplacer les caractères accentués, les majuscules, les espaces, les mots de moins de 2 ou 3 lettres (sauf cas particuliers), … Un truc qui ne garde que les mots clefs réellement important quoi.

Bon, sur ce, je retourne rewrité des pages !