PHP
Expressions régulières (regexp / PCRE)
Recherche…
Syntaxe
-
preg_replace($pattern, $replacement, $subject, $limit = -1, $count = 0);
-
preg_replace_callback($pattern, $callback, $subject, $limit = -1, $count = 0);
-
preg_match($pattern, $subject, &$matches, $flags = 0, $offset = 0);
-
preg_match_all($pattern, $subject, &$matches, $flags = PREG_PATTERN_ORDER, $offset = 0);
-
preg_split($pattern, $subject, $limit = -1, $flags = 0)
Paramètres
Paramètre | Détails |
---|---|
$pattern | une chaîne avec une expression régulière (modèle PCRE) |
Remarques
Les expressions régulières PHP suivent les normes de modèle PCRE, dérivées des expressions régulières Perl.
Toutes les chaînes PCRE en PHP doivent être entourées de délimiteurs. Un délimiteur peut être n'importe quel caractère non alphanumérique, sans barre oblique inverse et sans espace. Les délimiteurs populaires sont ~
, /
, %
par exemple.
Les modèles PCRE peuvent contenir des groupes, des classes de caractères, des groupes de caractères, des assertions de recherche / anticipation et des caractères échappés.
Il est possible d'utiliser des modificateurs PCRE dans la chaîne $pattern
. Les plus courantes sont i
(insensible à la casse), m
(multiligne) et s
(le métacaractère à point inclut les nouvelles lignes). Le modificateur g
(global) n'est pas autorisé, vous utiliserez preg_match_all
fonction preg_match_all
.
Les correspondances avec les chaînes PCRE sont effectuées avec des chaînes numérotées avec $
préfixe $
:
<?php
$replaced = preg_replace('%hello ([a-z]+) world%', 'goodbye $1 world', 'hello awesome world');
echo $replaced; // 'goodbye awesome world'
Chaîne correspondant aux expressions régulières
preg_match
vérifie si une chaîne correspond à l'expression régulière.
$string = 'This is a string which contains numbers: 12345';
$isMatched = preg_match('%^[a-zA-Z]+: [0-9]+$%', $string);
var_dump($isMatched); // bool(true)
Si vous passez un troisième paramètre, il sera renseigné avec les données correspondantes de l'expression régulière:
preg_match('%^([a-zA-Z]+): ([0-9]+)$%', 'This is a string which contains numbers: 12345', $matches);
// $matches now contains results of the regular expression matches in an array.
echo json_encode($matches); // ["numbers: 12345", "numbers", "12345"]
$matches
contient un tableau de la correspondance complète, puis des sous-chaînes dans l'expression régulière délimitée par des parenthèses, dans l'ordre du décalage entre parenthèses ouvertes. Cela signifie que si vous avez /z(a(b))/
comme expression régulière, index 0 contient la sous-chaîne entière zab
, index 1 contient la sous-chaîne limitée par les parenthèses externes ab
et index 2 contient les parenthèses internes b
.
Diviser la chaîne en tableau par une expression régulière
$string = "0| PHP 1| CSS 2| HTML 3| AJAX 4| JSON";
//[0-9]: Any single character in the range 0 to 9
// + : One or more of 0 to 9
$array = preg_split("/[0-9]+\|/", $string, -1, PREG_SPLIT_NO_EMPTY);
//Or
// [] : Character class
// \d : Any digit
// + : One or more of Any digit
$array = preg_split("/[\d]+\|/", $string, -1, PREG_SPLIT_NO_EMPTY);
Sortie:
Array
(
[0] => PHP
[1] => CSS
[2] => HTML
[3] => AJAX
[4] => JSON
)
Pour diviser une chaîne en un tableau, passez simplement la chaîne et une expression preg_split();
pour preg_split();
Pour faire correspondre et rechercher, ajouter un troisième paramètre ( limit
) vous permet de définir le nombre de "correspondances" à effectuer, la chaîne restante sera ajoutée à la fin du tableau.
Le quatrième paramètre est ( flags
) ici, nous utilisons le PREG_SPLIT_NO_EMPTY
qui empêche notre tableau de contenir des clés / valeurs vides.
Chaîne remplacée par une expression régulière
$string = "a;b;c\nd;e;f";
// $1, $2 and $3 represent the first, second and third capturing groups
echo preg_replace("(^([^;]+);([^;]+);([^;]+)$)m", "$3;$2;$1", $string);
Les sorties
c;b;a
f;e;d
Recherche tout entre les points-virgules et inverse l'ordre.
Correspondance globale de RegExp
Une correspondance globale RegExp peut être effectuée en utilisant preg_match_all
. preg_match_all
renvoie tous les résultats correspondants dans la chaîne objet (contrairement à preg_match
, qui ne renvoie que le premier).
La fonction preg_match_all
renvoie le nombre de correspondances. Le troisième paramètre $matches
contiendra des correspondances au format contrôlé par des indicateurs pouvant être donnés en quatrième paramètre.
Si un tableau est donné, $matches
tableau au format similaire à celui obtenu avec preg_match
, sauf que preg_match
s'arrête à la première correspondance, où preg_match_all
itération jusqu'à ce que la chaîne soit entièrement consommée et renvoie le résultat de chaque itération dans un tableau multidimensionnel , quel format peut être contrôlé par le drapeau dans le quatrième argument.
Le quatrième argument, $flags
, contrôle la structure du tableau $matches
. Le mode par défaut est PREG_PATTERN_ORDER
et les indicateurs possibles sont PREG_SET_ORDER
et PREG_PATTERN_ORDER
.
Le code suivant montre l'utilisation de preg_match_all
:
$subject = "a1b c2d3e f4g";
$pattern = '/[a-z]([0-9])[a-z]/';
var_dump(preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER)); // int(3)
var_dump($matches);
preg_match_all($pattern, $subject, $matches); // the flag is PREG_PATTERN_ORDER by default
var_dump($matches);
// And for reference, same regexp run through preg_match()
preg_match($pattern, $subject, $matches);
var_dump($matches);
Le premier var_dump de PREG_SET_ORDER
donne cette sortie:
array(3) {
[0]=>
array(2) {
[0]=>
string(3) "a1b"
[1]=>
string(1) "1"
}
[1]=>
array(2) {
[0]=>
string(3) "c2d"
[1]=>
string(1) "2"
}
[2]=>
array(2) {
[0]=>
string(3) "f4g"
[1]=>
string(1) "4"
}
}
$matches
trois tableaux imbriqués. Chaque tableau représente une correspondance, qui a le même format que le résultat de retour de preg_match
.
Le second var_dump ( PREG_PATTERN_ORDER
) donne cette sortie:
array(2) {
[0]=>
array(3) {
[0]=>
string(3) "a1b"
[1]=>
string(3) "c2d"
[2]=>
string(3) "f4g"
}
[1]=>
array(3) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "4"
}
}
Lorsque la même expression rationnelle est exécutée via preg_match
, le tableau suivant est renvoyé:
array(2) {
[0] =>
string(3) "a1b"
[1] =>
string(1) "1"
}
Chaîne remplacée par un rappel
preg_replace_callback
fonctionne en envoyant chaque groupe de capture correspondant au rappel défini et le remplace par la valeur de retour du rappel. Cela nous permet de remplacer les chaînes en fonction de tout type de logique.
$subject = "He said 123abc, I said 456efg, then she said 789hij";
$regex = "/\b(\d+)\w+/";
// This function replaces the matched entries conditionally
// depending upon the first character of the capturing group
function regex_replace($matches){
switch($matches[1][0]){
case '7':
$replacement = "<b>{$matches[0]}</b>";
break;
default:
$replacement = "<i>{$matches[0]}</i>";
}
return $replacement;
}
$replaced_str = preg_replace_callback($regex, "regex_replace", $subject);
print_r($replaced_str);
# He said <i>123abc</i>, I said <i>456efg</i>, then she said <b>789hij</b>