2011-11-09 36 views
11

que tengo un texto como:Obtener todas las apariciones de palabras entre corchetes

This is a {demo} phrase made for {test} 

Necesito conseguir

demo 
test 

Nota: Mi texto puede tener más de un bloque de {}, no siempre dos. Ejemplo:

This is a {demo} phrase made for {test} written in {English} 

que utiliza esta expresión /{([^}]*)}/ con preg_match pero devuelve sólo la primera palabra, no todas las palabras dentro del texto.

Respuesta

13

Uso preg_match_all lugar:

preg_match_all($pattern, $input, $matches); 

Es lo mismo que preg_match, con las siguientes estipulaciones:

Búsquedas tema para todas las coincidencias con la expresión regular dada en patrón y los pone en coincide en el orden especificado por los indicadores.

Después de encontrar la primera coincidencia, las búsquedas posteriores se continúan en adelante desde el final del último partido.

+0

perfecto, gracias –

2

A medida que el { y } son parte de la sintaxis de coincidencia de expresiones regulares, lo que necesita para escapar de estos personajes:

<?php 
$text = <<<EOD 
this {is} some text {from} 
which I {may} want to {extract} 
some words {between} brackets. 
EOD; 
preg_match_all("!\{(\w+)\}!", $text, $matches); 
print_r($matches); 
?> 

produce

Array 
(
    [0] => Array 
     (
      [0] => {is} 
      [1] => {from} 
      [2] => {may} 
      [3] => {extract} 
      [4] => {between} 
     ) 
    ... etc ... 
) 

Este ejemplo puede ser útil para comprender el uso de llaves en expresiones regulares:

<?php 
$str = 'abc212def3456gh34ij'; 
preg_match_all("!\d{3,}!", $str, $matches); 
print_r($matches); 
?> 

que devuelve:

Array 
(
    [0] => Array 
     (
      [0] => 212 
      [1] => 3456 
     ) 
) 

Nota que '34' está excluida de los resultados debido a que el \d{3,} requiere una coincidencia de al menos 3 dígitos consecutivos.

0

Hacer coincidir las porciones entre pares de llaves utilizando RegEx, es mucho mejor que usar Stack para este propósito. Usar RegEx sería algo así como «parche rápido y sucio», pero para analizar y procesar cadena de entrada debe usar una pila. Visite here para el concepto y here para aplicar el mismo.

8

Su expresión es correcta, pero debe utilizar preg_match_all() en su lugar para recuperar coincidencias todas. Aquí está un ejemplo práctico de lo que se vería así:

$s = 'This is a {demo} phrase made for {test}'; 

if (preg_match_all('/{([^}]*)}/', $s, $matches)) { 
     echo join("\n", $matches[1]); 
} 

Para captar también las posiciones de cada partido, puede pasar PREG_OFFSET_CAPTURE como el cuarto parámetro para preg_match_all. Para usar eso, puede usar el siguiente ejemplo:

if (preg_match_all('/{([^}]*)}/', $s, $matches, PREG_OFFSET_CAPTURE)) { 
     foreach ($matches[1] as $match) { 
      echo "{$match[0]} occurs at position {$match[1]}\n"; 
     } 
} 
Cuestiones relacionadas