PHP
Expresiones regulares (regexp / PCRE)
Buscar..
Sintaxis
-
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)
Parámetros
Parámetro | Detalles |
---|---|
$pattern | una cadena con una expresión regular (patrón PCRE) |
Observaciones
Las expresiones regulares de PHP siguen los estándares de patrones PCRE, que se derivan de las expresiones regulares de Perl.
Todas las cadenas PCRE en PHP deben incluirse entre delimitadores. Un delimitador puede ser cualquier carácter no alfanumérico, sin barra inversa, sin espacios en blanco. Los delimitadores populares son ~
, /
, %
por ejemplo.
Los patrones de PCRE pueden contener grupos, clases de caracteres, grupos de caracteres, aseveraciones anticipadas / anticipadas y personajes escapados.
Es posible usar modificadores PCRE en la cadena $pattern
. Algunos de los más comunes son i
(no distingue mayúsculas y minúsculas), m
(multilínea) y s
(el punto metacaracteriano incluye líneas nuevas). El modificador g
(global) no está permitido, en su lugar usará la función preg_match_all
.
Las coincidencias con las cadenas PCRE se realizan con $
cadenas prefijadas numeradas:
<?php
$replaced = preg_replace('%hello ([a-z]+) world%', 'goodbye $1 world', 'hello awesome world');
echo $replaced; // 'goodbye awesome world'
Coincidencia de cadenas con expresiones regulares
preg_match
comprueba si una cadena coincide con la expresión regular.
$string = 'This is a string which contains numbers: 12345';
$isMatched = preg_match('%^[a-zA-Z]+: [0-9]+$%', $string);
var_dump($isMatched); // bool(true)
Si pasa un tercer parámetro, se rellenará con los datos coincidentes de la expresión regular:
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
contiene una matriz de la concordancia completa y luego las subcadenas en la expresión regular delimitada por paréntesis, en el orden de desplazamiento de paréntesis abierto. Eso significa que, si tiene /z(a(b))/
como expresión regular, el índice 0 contiene la subcadena completa zab
, el índice 1 contiene la subcadena delimitada por los paréntesis externos ab
y el índice 2 contiene los paréntesis internos b
.
Dividir cadena en matriz por una expresión regular
$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);
Salida:
Array
(
[0] => PHP
[1] => CSS
[2] => HTML
[3] => AJAX
[4] => JSON
)
Para dividir una cadena en una matriz, simplemente pase la cadena y una preg_split();
para preg_split();
para hacer coincidir y buscar, agregar un tercer parámetro ( limit
) le permite establecer el número de "coincidencias" que se realizarán, la cadena restante se agregará al final de la matriz.
El cuarto parámetro es ( flags
) aquí usamos el PREG_SPLIT_NO_EMPTY
que evita que nuestra matriz contenga cualquier clave / valor vacío.
Cadena sustituyendo con expresión regular.
$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);
Salidas
c;b;a
f;e;d
Busca todo entre los puntos y comics e invierte el orden.
Partido RegExp global
Una coincidencia RegExp global se puede realizar utilizando preg_match_all
. preg_match_all
devuelve todos los resultados coincidentes en la cadena de asunto (a diferencia de preg_match
, que solo devuelve el primero).
La función preg_match_all
devuelve el número de coincidencias. Las $matches
tercer parámetro $matches
contendrán coincidencias en formato controlado por indicadores que se pueden dar en el cuarto parámetro.
Si se le da una matriz, $matches
contendrá la matriz en un formato similar que obtendría con preg_match
, excepto que preg_match
detiene en la primera coincidencia, donde preg_match_all
repite en la cadena hasta que la cadena se consume por completo y devuelve el resultado de cada iteración en una matriz multidimensional , cuyo formato puede ser controlado por la bandera en el cuarto argumento.
El cuarto argumento, $flags
, controla la estructura de $matches
array array. El modo predeterminado es PREG_PATTERN_ORDER
y los posibles indicadores son PREG_SET_ORDER
y PREG_PATTERN_ORDER
.
El siguiente código demuestra el uso 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);
El primer var_dump de PREG_SET_ORDER
da esta salida:
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
tiene tres matrices anidadas. Cada matriz representa una coincidencia, que tiene el mismo formato que el resultado de retorno de preg_match
.
El segundo var_dump ( PREG_PATTERN_ORDER
) da esta salida:
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"
}
}
Cuando la misma expresión regular se ejecuta a través de preg_match
, se devuelve la siguiente matriz:
array(2) {
[0] =>
string(3) "a1b"
[1] =>
string(1) "1"
}
Cadena reemplazar con devolución de llamada
preg_replace_callback
funciona enviando cada grupo de captura coincidente a la devolución de llamada definida y la reemplaza con el valor de retorno de la devolución de llamada. Esto nos permite reemplazar cadenas basadas en cualquier tipo de lógica.
$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>