2010-03-01 14 views

Respuesta

27

[y] son ​​caracteres especiales en una expresión regular. Se utilizan para enumerar los personajes de un partido. [a-z] coincide con cualquier letra minúscula entre "a" y "z". [03b] coincide con un "0", "3" o "b". Para hacer coincidir los caracteres "[" y "]", debe escapar de ellos con un \ anterior.

Su código actualmente dice "reemplazar cualquier carácter de [](). con una cadena vacía" (reordenados desde el orden en el que los escribió para mayor claridad).


partido codicioso:

preg_replace('/\[.*\]/', '', $str); // Replace from one [ to the last ] 

Un partido codicioso podría coincidir con múltiples [s] y s. Esa expresión tomaría an example [of "sneaky"] text [with more "sneaky"] here y la convertiría en an example here.


Perl tiene una sintaxis para un partido no expansivo (es muy probable que no quiere ser codicioso):

partidos
preg_replace('/\[.*?\]/', '', $str); 

no codiciosos tratar de atrapar el menor número de caracteres posible. Usando el mismo ejemplo: an example [of "sneaky"] text [with more "sneaky"] here se convierte en an example text here.


Sólo hasta el primer siguiente]:

preg_replace('/\[[^\]]*\]/', '', $str); // Find a [, look for non-] characters, and then a ] 

Esto es más explícito, pero más difícil de leer. Usando el mismo texto de ejemplo, obtendrá el resultado de la expresión no codiciosa.


Tenga en cuenta que ninguno de estos trata explícitamente con el espacio en blanco. Los espacios a ambos lados de [y] permanecerán.

También tenga en cuenta que todos estos pueden fallar para una entrada mal formada. Múltiples [s y] s sin coincidencias podrían causar un resultado sorprendente.

+0

Muchas gracias por la explicación! –

+0

Hmm, la entrada mal formada es algo con lo que me puedo encontrar. ¿Es posible manejar la instancia de no tener una coincidencia]? –

+0

Tendría que saber cómo se maneja. ¿Qué esperas que haga con una entrada mal formada? –

1

Creo que realmente desea parens para sus soportes exteriores, ya que es un grupo. los corchetes son un rango de expresiones. No estoy seguro de cómo escribirlo en SO.

/(\\[.*\\])/ 
6

En caso de que están buscando una eliminación recursiva:

$str = preg_replace("/\[([^\[\]]++|(?R))*+\]/", "", $str); 

que convertirá este:

Esto [Texto [más texto]] es fresco

a esto:

Th es genial

Cuestiones relacionadas