downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

Repetición> <Ajuste de opciones internas
[edit] Last updated: Fri, 25 May 2012

view this page in

Sub-patrones

Los sub-patrones están delimitados por paréntesis, los cuales pueden estar anidados. Marcar parte de un patrón como un sub-patrón hace dos cosas:

  1. Localiza un conjunto de alternativas. Por ejemplo, el patrón cata(rata|pulta|) coincide con una de las palabras "cata", "catarata", o "catapulta". Sin los paréntesis, coincidiría con "catarata", "pulta" o la cadena vacía.

  2. Establece el sub-patrón como un sub-patrón de captura (como se definió antes). Cuando el patrón completo coincide, esa porción de la cadena objetivo que coincidió con el sub-patrón es devuelta la llamador mediante el argumento ovector de pcre_exec(). Los paréntesis de apertura se cuentan de izquierda a derecha (comenzando por 1) para obtener el número de los sub-patrones de captura.

Por ejemplo, si la cadena "el rojo amanecer" se compara con el patrón el ((rojo|oscuro) (amanecer|atarceder)) las cadenas capturadas son "rojo amanecer", "rojo", y "amanecer", y son numeradas como 1, 2, y 3.

El hecho de que los simples paréntesis lleven a cabo dos funciones no es siempre útil. Con frecuencia se presenta el caso en el que un sub-patrón de agrupamiento se requiere sin la necesidad de una captura. Si un paréntesis de apertura es seguido por "?:", el sub-patrón no realiza ninguna captura, y no es contado cuando se computa el número de cualquier sub-patrón de captura subsiguiente. Por ejemplo, si la cadena "el oscuro atardecer" se compara con el patrón the ((?:rojo|oscuro) (amanecer|atarceder)) las sub-cadenas capturadas son "oscuro atardecer" y "atarceder", y son numeradas como 1 y 2. El número máximo de sub-cadenas capturadas es de 99, y el número máximo de todos los sub-patrones, tanto de captura como de no-captura, es de 200.

Como abreviación conveniente, si se necesita cualquier establecimiento de opciones al inicio de un sub-patrón que no sea de captura, las letras de opciones pueden aparecen entre el "?" y ":". Así lo dos patrones

(?i(?i:lunes|martes)
(?:(?i)lunes|martes)

coinciden exactamente con el mismo conjunto de cadenas. Dado que las ramas alternativas son probadas de izquierda a derecha, y las opciones no se reinician hasta que se alcance el final del sub-patrón, el establecimiento de una opción en una rama afecta a las ramas siguientes, por lo que los patrones de arriba coinciden tanto con "MARTES" como con "Lunes".

Es posible nombrar un sub-patrón usando la sintaxis (?P<nombre>patrón). Este sub-patrón será entonces indexado en el array de coincidencias mediante su posición numérica normal y mediante su nombre también. PHP 5.2.2 introdujo dos sintaxis alternativas (?<nombre>patrón) y (?'nombre'patrón).

A veces es necesario tener múltiples coincidencias, pero alternando subgrupos en una expresión regular. Normalmente, a cada subgrupo se le asignaría su propio número de retro-referencia incluso si sólo uno de ellos coincidiera. Para superar esto, la sintaxis (?| permite tener números duplicados. Considere la siguiente expresión regular comparada con la cadena Sunday:

(?:(Sat)ur|(Sun))day

Aquí Sun se guarda en la retro-referencia 2, mientras que la retro-referencia 1 está vacía. La comparación cede Sat a la retro-referncia 1 mientras que la retro-referncia 2 no existe. Cambiar el patrón para usar (?| corrige este problema:

(?|(Sat)ur|(Sun))day

Al usar este patrón, tanto Sun como Sat serían almacenados en la retro-referencia 1.



add a note add a note User Contributed Notes Sub-patrones
Chris 01-Feb-2010 08:51
For instance, one of my rewrite rules for a project I'm working on is "replace o with ö if o is the next to last vowel and even numbered (counting left to right)"

So, an example is:

heabatoik would become heabatöik (o is the next to last vowel, as well as the 4th vowel)

habatoik would not change (o is the next to last vowel, but is the 3rd vowel)

$str = preg_replace(
  '/^((?:[^aeiou]*[aeiou]){2})+' .
    '([^aeiou]*[aeiou][^aeiou]*)' .
    'o' .
    '(?=[^aeiou]*[aeiou][^aeiou]*$)/',
  '$1$2ö',
  'heabatoik');

 
show source | credits | stats | sitemap | contact | advertising | mirror sites