English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial básico de PHP

Tutorial avanzado de PHP

PHP & MySQL

Manual de referencia PHP

Expresiones regulares en PHP

En este tutorial, aprenderá cómo funcionan las expresiones regulares y cómo utilizarlas de manera eficiente para realizar coincidencias de patrones en PHP.

¿Qué son las expresiones regulares?

Las expresiones regulares generalmente se denominan “ regex ”o“ RegExp ,es un tipo de cadena de texto de formato especial utilizada para buscar patrones en el texto. Las expresiones regulares son una de las herramientas más potentes disponibles hoy en día, capaces de manejar y manipular texto de manera efectiva. Por ejemplo, se pueden utilizar para verificar si los datos de entrada del usuario (por ejemplo, nombre, correo electrónico, número de teléfono, etc.) tienen el formato correcto, buscar o reemplazar cadenas de texto que coincidan en el contenido del texto, etc.

PHP(版本5.3及更高版本)通过其preg_函数系列支持Perl样式正则表达式。为什么使用Perl风格的正则表达式?因为Perl(实用提取和报告语言)是第一种为正则表达式提供集成支持的主流编程语言,并且以对正则表达式的强大支持以及非凡的文本处理和操纵功能而闻名。

在深入探讨正则表达式世界之前,让我们首先简要介绍一下常用的PHP内置模式匹配功能。

函数描述
preg_match()执行正则表达式匹配。
preg_match_all()执行全局正则表达式匹配。
preg_replace()执行正则表达式搜索并替换。
preg_grep()返回与模式匹配的输入数组的元素。
preg_split()使用正则表达式将字符串拆分为子字符串。
preg_quote()引用在字符串中找到的正则表达式字符。

注意: PHP preg_match()函数在找到第一个匹配项后将停止搜索,而preg_match_all()函数将继续搜索直到字符串的末尾并找到所有可能的匹配项,而不是在第一个匹配项处停止。

正则表达式语法

正则表达式语法包括特殊字符的使用(请勿与HTML特殊 character混淆)。在正则表达式中具有特殊含义的字符是:. * ? + [ ] ( ) { } ^ $ | \。每当您想按字面意义使用它们时,都需要反斜杠。例如,如果要匹配“.”,则必须编写\.。所有其他字符将自动采用其字面含义。

以下各节描述了可用于制定模式的各种选项:

字符类

字符模式周围的方括号称为字符类,例如[ABC]。 字符类始终匹配指定字符列表中的单个字符,这意味着表达式[abc]只匹配a、b或c字符。

也可以定义否定的字符类,以匹配除括号中包含的字符以外的任何字符。否定的字符类是通过将尖号(^)符号紧接在左括号之后来定义的,例如[^abc]。

您还可以通过在字符类(例如-)中使用连字符()来定义字符范围[0-9。让我们看一些字符类的实例:

Expresión regular¿Qué puede hacer?
[abc]Coincide con cualquier carácter de a, b o c.
[^abc]Coincide con cualquier carácter excepto a, b, c.
[a-z]Coincide con cualquier carácter de la letra minúscula a a la letra minúscula z.
[A-Z]Coincide con cualquier carácter de la letra mayúscula A a la letra mayúscula Z.
[a-Z]Coincidir con cualquier carácter desde la letra minúscula a hasta la letra mayúscula Z.
[0-9]Coincide con 0 a9un número entre
[a-z0-9]Coincide con a a z o 0 a9caracteres individuales entre

El siguiente ejemplo le mostrará cómo usar expresiones regulares y la función preg_match() de PHP para buscar si existe un patrón en una cadena:

<?php
$pattern = "/ca[kf]e/";
$text = "He was eating cake in the cafe.";
if(preg_match($pattern, $text)){
    echo "Coincidencia encontrada!";
} else{
    echo "Coincidencia no encontrada.";
}
?>
测试看看‹/›

Del mismo modo, puede usar la función preg_match_all() para encontrar todas las coincidencias en una cadena:

<?php
$pattern = "/ca[kf]e/";
$text = "He was eating cake in the cafe.";
$matches = preg_match_all($pattern, $text, $array);
echo $matches . " matches were found.";
?>
测试看看‹/›

Consejo:Las expresiones regulares no son exclusivas de PHP. Java, Perl, Python y otros lenguajes utilizan los mismos símbolos para buscar patrones de texto.

Clases de caracteres predefinidas

Algunos caracteres de clase se utilizan con frecuencia hasta el punto de tener nombres abreviados. La siguiente tabla enumera aquellos tipos de caracteres predefinidos:

Atajos¿Qué puede hacer?
.Coincide con cualquier carácter individual excepto el salto de línea \n.
\dCoincide con cualquier carácter numérico. equivalente a [0-9] idéntico.
\DCoincide con cualquier carácter no numérico. equivalente a [^0-9] idéntico
\sCoincide con cualquier carácter de espacio en blanco (espacio, tabulador, salto de línea o retorno de carro). equivalente a [\t\n\r]
\SCoincide con cualquier carácter no espaciado. equivalente a [^\t\n\r]
\wCoincide con cualquier carácter palabra (definido como a a z, A a Z, 0 a9y guiones bajos). equivalente a [a-zA-Z_0-9] idéntico
\WCoincide con cualquier carácter no palabra. equivalente a [^a-Za-Z_0-9] idéntico

El siguiente ejemplo le mostrará cómo usar expresiones regulares y la función preg_replace() de PHP para buscar y reemplazar espacios en una cadena:

<?php
$pattern = "/\s/";
$replacement = ""-";
$text = "Earth revolves around\nthe\tSun";
//Reemplazar los espacios, los saltos de línea y los tabuladores
echo preg_replace($pattern, $replacement, $text);
echo "<br>";
//Sólo reemplazar los espacios
echo str_replace(" ", ""-"$text);
?>
测试看看‹/›

Cuantificadores repetitivos

En la sección anterior, aprendimos cómo coincidir caracteres individuales de múltiples maneras. Pero, ¿qué pasa si desea coincidir múltiples caracteres? Por ejemplo, supongamos que desea buscar una o más instancias de la letra p en una palabra, o una palabra que contenga al menos dos p, y así sucesivamente. Aquí es donde entran en juego los cuantificadores. Al usar cuantificadores, puede especificar cuántas veces deben coincidir los caracteres en una expresión regular.

La siguiente tabla enumera varios métodos para cuantificar patrones específicos:

Expresión regular¿Qué puede hacer?
p+Coincidencia de una o más apariciones de la letra p.
p*Coincidencia de cero o más apariciones de la letra p.
p?Coincidencia de cero o una aparición de la letra p.
p{2}Coincidencia exacta de dos letras p.
p{2,3}Coincidencia de al menos dos apariciones de la letra p, pero no más de tres apariciones de la letra p.
p{2,}

Coincidencia de dos o más apariciones2aparición de la letra p.

p{3}Coincidencia máxima de tres apariciones de la letra p

En el siguiente ejemplo, la expresión regular utilizará la función preg_split() de PHP para dividir la cadena en comas, secuencias de comas, espacios o su combinación:

<?php
$pattern = "/[\s,]+/";
$text = "My favourite colours are red, green and blue";
$parts = preg_split($pattern, $text);
 
//Recorrer el array $parts y mostrar las subcadenas
foreach($parts as $part){
    echo $part . "<br>";
}
?>
测试看看‹/›

Anclaje de posición

En algunos casos, es posible que desee realizar coincidencias en el inicio o el final de una línea, una palabra o una cadena. Para lograr esto, puede usar anclajes. Dos anclajes comunes son el símbolo de inserción (^) para representar el inicio de una cadena y el símbolo de dólar ($) para representar el final de una cadena.

Expresión regular¿Qué puede hacer?
^pCoincidencia con la letra p al inicio de la línea.
p$Coincidencia con la letra p al final de la línea.

En el siguiente ejemplo, la expresión regular solo mostrará los nombres del array con el nombre que comienza con la letra "J" utilizando la función preg_grep() de PHP:

<?php
$pattern = "/^J/";
$names = array("Jhon Carter", "Clark Kent", "John Rambo");
$matches = preg_grep($pattern, $names);
 
//Recorrer el array $matches y mostrar los nombres coincidentes
foreach($matches as $match){
    echo $match . "<br>";
}
?>
测试看看‹/›

Modificadores de patrones

Los modificadores de patrones le permiten especificar el modo de tratamiento de la coincidencia del patrón. Los modificadores de patrones se colocan directamente después de la expresión regular, por ejemplo, si desea buscar patrones sin distinción de mayúsculas y minúsculas, puede usar el modificador i, como se muestra a continuación:/pattern/i. La siguiente tabla enumera algunos de los modificadores de patrones más comunes.

Modificadores¿Qué puede hacer?
iHacer que la coincidencia no sea sensible a mayúsculas y minúsculas.
mCambiar el comportamiento de ^ y $ para que coincidan con los límites de nueva línea (es decir, el inicio o el final de cada línea en una cadena de múltiples líneas), en lugar de los límites de la cadena.
gEjecutar una coincidencia global, es decir, encontrar todos los elementos coincidentes.
oEvaluar la expresión solo una vez.
sCambiar el comportamiento de los puntos (puntos) para que se ajuste a todos los caracteres, incluyendo los saltos de línea.
x允许您在正则表达式中使用空格和注释以保持清晰度。

以下示例将向您展示如何使用i修饰符和PHP preg_match_all()函数执行不区分大小写的全局搜索。

<?php
$pattern = "/color/i";
$text = "Color red is more visible than color blue in daylight.";
$matches = preg_match_all($pattern, $text, $array);
echo $matches . " matches were found.";
?>
测试看看‹/›

同样,以下示例显示如何使用^锚点和m修饰符与PHP preg_match_all()函数在多行字符串的每一行的开头进行匹配。

<?php
$pattern = "/^color/im";
$text = "Color red is more visible than \ncolor blue in daylight.";
$matches = preg_match_all($pattern, $text, $array);
echo $matches . " matches were found.";
?>
测试看看‹/›

词边界

单词边界字符(\b)可帮助您搜索以模式开头和/或结尾的单词。例如,正则表达式/\bcar/匹配以模式car开头的单词,并匹配cart, carrot, 或 cartoon,但不匹配oscar。

同样,正则表达式/car\b/匹配以模式car结尾的单词,并且匹配scar, oscar, 或 supercar,但不匹配cart。同样,/\bcar\b/匹配以单词car开头和结尾的单词,并且仅匹配单词car。

以下示例将以粗体突出显示以car开头的单词:

<?php
$pattern = '/\bcar\w*/';
$replacement = '<b>$0</b>';
$text = 'Words beginning with car: cart, carrot, cartoon. Words ending with car: scar, oscar, supercar.';
echo preg_replace($pattern, $replacement, $text);
?>
测试看看‹/›

我们希望您已经了解了正则表达式的基础知识。要了解如何使用正则表达式验证表单数据,请查看有关PHP表单验证的教程。