• PHP > Les expressions régulières (regex)

      preg_match() recherche un motif dans la chaîne de caractères, retourne true si le motif existe, et false sinon.

      preg_match_all() Effectue une recherche globale sur toutes les occurrences du motif dans la chaîne. Utile pour la recherche et le remplacement.

      preg_replace() Effectue une recherche et un remplacement d’expressions régulières.

      preg_grep() recherche tous les éléments du tableau d’entrée, retournant tous les éléments correspondant au motif regex dans une chaîne.

      preg_split() Divise une chaîne de caractères en chaînes de caractères en utilisant une expression régulière.

      preg_quote() Cite les caractères d’expression régulière trouvés dans une chaîne.

       

      Note : preg_match() arrête la recherche après avoir trouvé la première correspondance, alors que preg_match_all() continue la recherche jusqu’à la fin de la chaîne et trouve toutes les correspondances possibles au lieu de s’arrêter au premier résultat.

      Délimiteurs

      Par exemple, si vous choisissez “~” comme délimiteur, pour le motif regex \b\w\w+\b, vous devrez donner la chaîne ~\b\w+\b~ à la fonction preg.

      Pour le délimiteur, vous pouvez choisir n’importe quel caractère à l’exception des espaces et des barres obliques inverses. Mais choisissez judicieusement, car si votre délimiteur apparaît dans le motif, il doit être échappé. La barre oblique avant est un délimiteur populaire, et bizarrement, puisqu’elle doit être échappée dans toutes sortes de chaînes de caractères en rapport avec les chemins de fichiers. Par exemple, pour faire correspondre http://, voulez-vous vraiment que votre chaîne regex ressemble à /http:\/\/\/// ?

      Est-ce que ~http://~ n’est pas plus lisible ?

      Les caractères rares tels que “~”, “%”, “#” ou “@” sont des choix plus raisonnables et assez populaires.

      Syntaxe des REGEX

      La syntaxe des expressions régulières inclut l’utilisation de caractères spéciaux. Les caractères auxquels on donne une signification spéciale dans une expression régulière, sont : . * ? + [ ] ( ) { } ^ $ |. Vous devrez échapper ces caractères chaque fois que vous voudrez les utiliser littéralement. Par exemple, si vous voulez faire correspondre “.”, vous devrez écrire \. Tous les autres caractères prennent automatiquement leur sens littéral.

      Le tableau suivant décrit les regex les plus courants :

       

      . Correspond à n’importe quel caractère simple sauf le caractère de nouvelle ligne \n

      foo Correspond à la chaîne “foo”

      ^foo Correspond à la chaîne “foo” en début de chaîne

      foo$ Correspond à la chaîne “foo” en fin de chaîne

      ^foo$ Correspond exactement à la chaîne “foo”

      [abc] Correspond à l’un des caractères a, b ou c.

      [^abc] Correspond à un caractère autre que a, b ou c.

      [a-z] Correspond à n’importe quel caractère, de a minuscule à z minuscule.

      [^A-Z] Correspond à n’importe quel caractère autre qu’une majuscule

      [a-z]+ Correspond à un ou plus caractères minuscules

      [0-9.-] Correspond à n’importe quel nombre, point ou tiret

      \d Correspond à n’importe quel chiffre décimal. Équivalent à [0-9].

      \D Correspond à n’importe quel caractère non numérique. Équivalent à [^0-9]

      \s Correspond à n’importe quel caractère d’espacement (espace, tabulation, nouvelle ligne ou caractère de retour chariot). Similaire à [\t\n\r]

      \S Correspond à n’importe quel caractère qui n’est pas un caractère d’espacement

      \w Correspond à n’importe quel caractère de mot (défini de a à z, de A à Z, de 0 à 9, et le trait de soulignement). Identique à [a-zA-Z_0-9]

      \W Correspond à n’importe quel caractère qui n’est pas un mot. Identique à [^a-zA-Z_0-9]

      (gif|jpg) Correspond à “gif” ou “jpg”

      ^[a-zA-Z0-9_]{1,}$ Correspond à un mot d’au moins une lettre, un chiffre ou “_”

      ([wx])([yz]) Correspond à “wy”, “wz”, “xy” ou “xz”

      [^A-Za-z0-9] Correspond à un symbole (ni une lettre, ni un nombre)

      ([A-Z]{3}|[0-9]{4}) Correspond à 3 lettres ou 4 nombres

      Exemples de REGEX

      valider un nom de domaine

      Chaque domaine de site Web contient le protocole initial (HTTP ou HTTPS) et souvent un sous-domaine plus le chemin de page supplémentaire. Vous pouvez utiliser ce snippet pour valider un nom de domaine.

      $url = "https://www.zenndevs.xyz/";
      if (preg_match('/^(http|https|ftp):\/\/([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(d+)?\/?/i', $url)) {
          echo "Your url is ok.";
      } else {
          echo "Wrong url.";
      }

      Comme pour la validation des adresses emails, la fonction PHP filter_var() est aussi très pratique pour valider les noms de domaine. Merci bazooka07 pour le commentaire

      valider une adresse email

      L’une des tâches les plus courantes pour un développeur est de vérifier si une chaîne est formatée dans le style d’une adresse e-mail. Il existe de nombreuses variantes différentes pour accomplir cette tâche, en voici une.

      $email = "contact@exemple.com";
      if (preg_match('/[-0-9a-zA-Z.+_]+@[-0-9a-zA-Z.+_]+.[a-zA-Z]{2,4}/igm', $email)) {
          echo "Your email is ok.";
      } else {
          echo "Wrong email.";
      }

      Comme le mentionne Da Scritch dans les commentaires, la validation des adresses emails en REGEX n’est pas une sinécure et il vaut mieux pour cela utiliser la fonction PHP filter_var() bien plus simple et pour un meilleur résultat !

      valider une date française

      PHP a des fonctions et méthodes de date plutôt complètes mais vous pouvez avoir besoin d’un petit snippet permettant une validation rapide d’un format de date particulier. Si vous êtes en javascript allez voir mon petit article sur le librairie de gestion de date avec moment.js

      $dateFr = "14/10/2019";
      if (preg_match('/^(((0[1-9])|(1\d)|(2\d)|(3[0-1]))\/((0[1-9])|(1[0-2]))\/(\d{4}))$/gm', $dateFr)) {
          echo "Your date is ok.";
      } else {
          echo "Wrong date.";
      }

      valider un numéro de téléphone

      $tel = '+33100000000';
      
      if (preg_match('/((\+)33|0|0033)[1-9](\d{2}){4}/igm', $tel)) {
          echo "Your tel is ok.";
      } else {
          echo "Wrong tel.";
      }

      récupérer l’identifiant youtube d’un lien

      YouTube a gardé la même structure d’URL pendant des années parce qu’elle fonctionne tout simplement. C’est aussi le site de partage de vidéos le plus populaire sur le Web, donc les vidéos YouTube ont tendance à générer le plus de trafic.

      Si vous avez besoin de sortir un identifiant vidéo YouTube d’une URL, ce code regex est parfait et devrait fonctionner parfaitement pour toutes les variantes des structures URL YouTube.

      $youtube_url = 'https://youtu.be/tdZtQsu821M';
      
      if (preg_match('/https:\/\/(?:youtu\.be\/|(?:[a-z]{2,3}\.)?youtube\.com\/watch(?:\?|#\!)v=)([\w-]{11}).*/ig', $youtube_url, $matches)) {
          echo "Your youtube id is : " . $matches[1];
      } else {
          echo "Wrong youtube url.";
      }

      surligner un mot dans une phrase

      Cette expression régulière très utile trouvera un mot spécifique dans une chaîne de caractères et le surlignera. Extrêmement utile pour les résultats de recherche. Rappelez-vous qu’il est sensible à la casse.

      //Highlight a word in the content
      $text = "Sample sentence from KomunitasWeb, regex has become popular in web programming. Now we learn regex. According to wikipedia, Regular expressions (abbreviated as regex or regexp, with plural forms regexes, regexps, or regexen) are written in a formal language that can be interpreted by a regular expression processor";
      $text = preg_replace("/\b(regex)\b/i", '<span style="background:#5fc9f6">\1</span>', $text);
      echo $text;

      récupérer la source (src) d’une balise image

      Si, pour une raison quelconque, vous devez extraire la source d’une image directement à partir de HTML, cet extrait de code est la solution parfaite.

      $img_html = '<p>Mon image <img src="https://www.zendevs.xyz/upload/2019/09/mon-image.jpg?x61142" alt="mon image" /> </p>';
      
      if (preg_match('/\< *[img][^\>]*[src] *= *[\"\']{0,1}([^\"\'\ >]*)/gmi', $img_html, $matches)) {
          echo "Votre image : " . $matches[1];
      } else {
          echo "Aucune image";
      }

      Si vous préférez plutôt obtenir toutes les images d’une page web, ce bout de code pourrait vous aider

      $images = [];
      preg_match_all('/(img|src)=("|')[^"'>]+/i', $data, $media);
      unset($data);
      $data=preg_replace('/(img|src)("|'|="|=')(.*)/i',"$3",$media[0]);
      foreach($data as $url)
      {
      	$info = pathinfo($url);
      	if (isset($info['extension']))
      	{
      		if (($info['extension'] == 'jpg') ||
      		($info['extension'] == 'jpeg') ||
      		($info['extension'] == 'gif') ||
      		($info['extension'] == 'png'))
      		array_push($images, $url);
      	}
      }
      print_r($images);

      récupérer le Meta Title d’une page HTML

      Cet extrait de code pratique trouvera et affichera le texte contenu entre les balises <title> et </title> d’une page HTML.

      $fp = fopen("https://www.zendevs.xyz/","r");
      while (!feof($fp) ){
          $page .= fgets($fp, 4096);
      }
      
      $titre = eregi("<title>(.*)</title>",$page,$regs);
      echo $regs[1];
      fclose($fp);

      --

 

Aucun commentaire

 

Laissez un commentaire