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.

Classes abstraites et finales

Publié dans PHP objet | 2 commentaires

Les notions de classes abstraites et classes finales permettent de sécuriser notre programmation PHP, dans le sens qu’elles permettent d’éviter qu’un programmeur, reprenant notre code, n’en contourne la logique et s’égare ainsi sur une fausse piste.
En effet :

  • Class abstraite : class qui ne peut être instanciée, il est donc OBLIGATOIRE de créer une class héritante de cette class pour s’en servir. Utile lorsque l’on créé une class générique qui ne servira qu’à créer des sous class et non à être instanciée. Une telle class ne contient donc pas de __construct() puisqu’elle n’est pas instanciée. Mot clef : abstract.
  • Class finale : class qui NE PEUT PLUS avoir de sous-class, c’est-à-dire de class héritante. Les méthodes de cette class ne pourront être surchargées (réécrites, redéfinies). Mot clef : final. De la même manière, on peut aussi déclarer des méthodes abstraites et finales.
  • Méthode abstraite : méthode qui doit OBLIGATOIREMENT être surchargée (réécrite, ou redéfinie). Une class contenant une méthode abstraite doit aussi être abstraite. Mot clef : abstract.
  • Méthode finale : méthode qui NE PEUT ÊTRE surchargée (réécrite, redéfinie). Une class finale s’applique sur toutes les méthodes ou attributs de la classe, alors qu’ici on ne touche qu’à une seule méthode. Mot clef : final. Pour bien comprendre ces 2 notions et en saisir mieux l’intérêt voici plusieurs exemples, un pour chaque cas.

Class et méthodes abstraites

 abstract class Site {
	protected $type;
	protected $name;
	public function getType()
	{
		return $this->type;
	}
	public function getName()
	{
		return $this->name;
	}
}
$monSite = new Site();
echo $monSite->getType(); // Erreur : on tente d'instancier une classe abstraite

Continuer la lecture

Cahier des charges : Doodle like en PHP objet

Publié dans Projets | 2 commentaires

Bon, il me semble que j’ai fait un bon tour de la théorie au sujet du PHP objet (j’ai encore au moins 2 billets théoriques à écrire), et je l’applique déjà depuis plusieurs semaines durant mon stage. Mais maintenant j’aimerai bien me faire un petit projet tout en PHP objet. Je ne sais pas si vous connaissez Doodle ? Je trouve le concept vraiment génial. Ce site permet à n’importe qui de créer des sondages classiques, ou alors des sortes de sondages permettant de fixer facilement une date d’un rendez-vous pour autant de personnes que l’on souhaite. Je vais donc réaliser dans les jours à venir (et j’espère arriver aux termes de ce projet) un Doodle like (j’ai pas encore d’idées de nom… mais ça viendra) !
Voici donc un cahier des charges d’un Doodle like.

Feuille de route

  • Version tout en PHP (orienté objet) sans aucun Javascript ou autre. Fonctionnalité : « Trouver une date ».
  • Ajout du Javascript pour la fonctionnalité « Trouver une date » et le reste du site.
  • Ajout de fonctionnalités « Faire un choix », « Sondage », « Qui prend quoi, pour un repas », ou autre, et amélioration des fonctionnalités présentes. En PHP (orienté objet) d’abord puis en améliorant avec le Javascript.

Continuer la lecture

Générer un array de plus de 2 400 000 éléments

Publié dans PHP | Un commentaire

Peut-être avez-vous déjà essayé de créer un array très très grand. Moi oui. Mon problème c’est que les valeurs que contenaient mon array étaient aussi très grande. En fait j’ai essayé de générer un array contenant 2 600 000 éléments allant de 1 à 2 600 000.

Naïvement avec une boucle for

 $a_cle = array();
for($i=1;$i<=2600000;$i++) {
   $a_cle[] = $i;
}

Mais là… erreur : Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 16 bytes) in /var/agence.php on line 52

Un peu plus malin avec range()

$a_cle = range(1, 2600000);

Mais là… erreur : Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 16 bytes) in /var/agence.php on line 52

Futé avec array_flip

En fait, je me suis aperçu que ce dont j’avais besoin c’était des numéros que je pouvais prendre au hasard (mais jamais les mêmes) allant de 1 à 2600000, mais pas forcément d’un array avec les clés allant de 1 à 2600000 et les valeurs allant de 1 à 260000. Donc j’ai créé avec array avec des clés allant de 1 à 2600000 et des valeurs toutes à 1.

$a_cle = array_flip($a_cle);
$cle = array_rand($a_cle);
echo $cle; unset($a_cle[$cle]);

Vous me direz que j’aurai pu modifier le php.ini pour augmenter l’espace mémoire utilisable par PHP, mais :

  • je n’y avais pas accès
  • je ne savais comment faire à l’époque :p

Optimiser ses requêtes MySQL

Publié dans SQL | 4 commentaires

Je travaille actuellement sur une table MySQL qui va contenir près de 7 millions de tuples (avec une quinzaine de colonnes chacun bien sûr, ce ne serait pas drôle sinon !), il se trouve qu’elle en contient déjà près de 3 millions, et que je suis obligé de faire une vingtaine de requêtes différentes dans cette table pour chaque page et que, par conséquent, le site qui l’utilise plante à fond. La mémoire utilisable par MySQL est dépassée. Alors certes, on peut modifier la taille de la mémoire utilisable par MySQL (et il faudrait aussi sûrement modifier la durée maximum d’exécution d’un script PHP), mais le but c’est quand même de charger des pages en moins de 30 secondes. J’ai donc cherché des réponses sur le Web et auprès des développeurs de ma boîte. Voici donc quelques points que j’ai pu retenir.

Structure de la table

Il vaut mieux éviter, sauf si c’est nécessaire, l’utilisation de champ NULL par défaut. En effet, comme on peut le voir sur cet article d’Apprendre PHP NULL est une valeur spéciale qui nécessite un traitement spécial, MySQL ne peut pas le tester avec un égal et ne peut le comparer à la chaine vide ou à 0, il est obligé d’utiliser IS ou le symbole équivalent <=>. NULL par défaut est d’autant plus à bannir pour les index. Utiliser des colonnes avec le meilleur type et la meilleure taille possible. Un prénom n’a par exemple par besoin d’être en VARCHAR(255), un VARCHAR(20) suffit plus que largement. Une bonne technique pour optimiser ses tables est d’utiliser PROCEDURE ANALYSE(). On créé ses tables au feeling (je parle juste de la structure, vous ne couperez pas à la normalisation tout ça, héhé), on les remplie avec un contenu à peu près définitif est on utilise une requête du style :

SELECT id, titre, message FROM blog PROCEDURE ANALYSE()

MySQL va nous répondre un joli petit array avec la taille max et min de chaque colonne id, titre et message, quelques autres informations intéressantes et surtout une proposition de type(taille) optimisée à votre table. Encore une fois, c’est l’article d’Apprendre PHP qui en montre un exemple vraiment parlant.
Continuer la lecture

Multilangue pour WordPress

Publié dans Wordpress | 3 commentaires

Comment rendre WordPress multilangue (ou multilingue, comme vous voulez) ? C’est-à-dire comment faire en sorte que les billets, les tags, les catégories, les pages et les liens, (voir le titre, les titres des menus, etc…) soient accessibles en différentes langues ? Il y a plusieurs solutions :

  • Modifier soit même WordPress
  • Modifier WordPress à l’aide d’un plugin Et plusieurs modes de traduction :
  • Traduction automatisée avec Google Translate ou autre (peu recommandé)
  • Traduction à la main de chaque billets, tags, catégories, pages, liens… (recommandé) C’est en général la traduction du design, du titre, des menus, etc, qui pose le plus de problèmes.

Continuer la lecture

Google Alertes

Publié dans Référencement | Un commentaire

Je viens de découvrir un outils qui peut être bien utile lorsque l’on s’intéresse à un sujet en particulier, ou plus pratiquement, si l’on souhaite surveiller les sites parlant d’un thème similaire au(x) sien(s) sur la Toile. Il s’agit de Google alertes.

L’idée est toute simple : j’ai un site sur les brioches et je veux savoir l’actualité de la brioche sur le Web. J’inscris le mot clef « brioche » dans ma liste de termes recherchés de Google Alertes, et ce dernier m’indiquera au fil du temps par e-mail ou via un flux RSS (visible directement via Google reader) les derniers sites qui en parle. Cela permet, par exemple, de faire des rétro-liens sur des billets intéressants parlant du même sujet que les siens, ou de donner des compléments d’informations, ou des remarques sur le forum ou les commentaires du site en question, avec un lien vers son propre site dans la signature.

Bref, on n’arrête pas le progrès ! (et moi j’apprends de plus en plus de choses dans le domaine du référencement)

Petit bilan sur les premiers mois de 30 minutes par jour

Publié dans Informations | Laisser un commentaire

Et voilà, j’ai envie de dire que cela fait vraiment 1 mois que j’ai commencé ce blog 30 minutes par jour. Certes en réalité le premier billet est paru en avril 2009, mais le temps que la machine se mette en place…

Le bilan est plutôt positif puisque j’arrive à prendre un rythme assez soutenu (ce billet étant le 36ème) mais peu contraignant pour moi. D’ailleurs, je trouve l’effet « blog » assez sympa puisque, contrairement à mon site perso, je n’ai pas vraiment à me restreindre sur le sujet des articles, ni sur leur exhaustivité. Dès qu’une idée me passe par la tête, je peux commencer à écrire quelque chose, puis je me renseigne sur le Web ou dans des bouquins, et je met à jour mon billet jusqu’à ce que j’arrive à quelque chose de suffisamment correct pour être publié. Mais qu’importe si le billet en question n’est pas complet, si toutes les manipulations ne sont pas expliqués en détails : je pourrai en parler à nouveau dans un autre billet et donner des compléments d’informations (le module « Billet connexe » de Dotclear se chargera de lier mes différents billets), et même éditer un billet si ça me chante. Et c’est d’autant mieux que tout cela pourra me servir de bases pour des tutoriels que je pourrai ensuite créer sur la Bnbox.

Eh tiens, quant aux sujets abordés… Pour l’instant, j’ai surtout parlé de PHP Objet (17 billets en tout) et je pense arriver au bout de mes pérégrinations. J’ai déjà des projets pour les prochains jours, et ça tournera toujours autour du PHP Objet. Mais j’ai aussi pu faire quelques billets sur Apache, ou sur le CMS Dotclear, et j’ai eu l’occasion de parler de quelques projets. Je pense continuer sur la même lancée : des billets fils rouges (en ce moment sur le PHP Objet), et quelques billets divers. (sur mes projets ou mes découvertes du moment) Je pense pouvoir continuer sur ce rythme très facilement durant toute la durée de mon stage. Mais je me demande si j’y arriverai lorsque les cours reprendront. L’avenir nous le dira !

Etude SEO : Bible Ipsum

Publié dans Référencement | Laisser un commentaire

Petite étude SEO (Search engine optimization) pour le site Bible Ipsum.
Le but ? Le faire remonter un peu sur Google pour y amener des visiteurs. Bon certes, je ferai peut-être mieux de commencer par coder le système pour aider à traduire le site facilement, et corriger 2-3 bugs aussi, voir ajouter quelques fonctionnalités. Mais bon… C’est ma première étude SEO.
A ma connaissance ce n’est pas franchement une science, ça s’apprend sur le tas, en testant, en lisant des articles ou des livres, et en observant ceux dont c’est le métier.

Mots clefs à travailler (et leurs déclinaisons) : (26)

  • Bible Ipsum
  • Lorem Ipsum, lipsum, dolor sit amet
  • Texte d’attente, de remplissage, de production, de pré-production
  • Paragraphe d’attente, de remplissage, de production, de pré-production
  • Générateur de texte d’attente, de remplissage, de production, de pré-production
  • Générateur de paragraphes d’attente, de remplissage, de production, de pré-production
  • Générateur de lignes
  • Générateur de mots
  • générateur de texte aléatoire
  • Générateur
  • Bible
  • Psaumes + Psaumes n
  • Texte de remplissage dans votre langue, en latin
  • (optimiser) lecture sur écran !!Table motclef motclef(id, kw, titre, texte, type(1 normal, 2 psaumes n))

Continuer la lecture

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 !