2011-08-17 14 views
5

Encontré esta expresión regular en un script que estoy personalizando. ¿Puede alguien decirme qué está haciendo?¿Qué está haciendo esta expresión regular?

function test($text) { 
    $regex = '/([\x00-\x7F] | [\xC0-\xDF][\x80-\xBF] | [\xE0-\xEF][\x80-\xBF]{2} | [\xF0-\xF7][\x80-\xBF]{3}) | ./x'; 
    return preg_replace($regex, '$1', $text); 
} 
+1

¿Qué parte de ella no comprende? ¿Cuál es el contexto? –

+0

¡¡wooooah !! , tu expresión regular me dio escalofríos :-) –

Respuesta

2

Dentro del grupo de captura hay cuatro opciones:

  1. [\x00-\x7F]
  2. [\xC0-\xDF][\x80-\xBF]
  3. [\xE0-\xEF][\x80-\xBF]{2}
  4. [\xF0-\xF7][\x80-\xBF]{3}

Si ninguno de estos patrones coincide en una ubicación dada, cualquier carácter se comparará con el . que esté fuera del grupo de captura.

La llamada preg_replace iterará sobre $text buscando todas las coincidencias que no se superpongan, reemplazando cada coincidencia con lo que fue capturado.

Hay dos posibilidades aquí, o bien todo el partido estaba dentro del grupo de captura por lo que la sustitución no cambia $text, o la . al final igualó un solo carácter y ese carácter se elimina de $text.

Éstos son algunos ejemplos básicos:

  • Si un personaje en el rango \xF8-\xFF aparece en el texto, siempre va a ser eliminado
  • Un personaje de \xC0-\xDF será eliminado a menos seguido de un carácter en \x80-\xBF
  • Un personaje de \xE0-\xEF se eliminará a menos seguido de dos caracteres en \x80-\xBF
  • Un personaje de Wil \xF0-\xF7 l ser retirado a menos seguido de tres caracteres en \x80-\xBF
  • Un personaje en \x80-\xBF será eliminada a menos que se corresponde como parte de uno de los casos anteriores
1

El propósito parece ser la de "limpia" UTF 8 texto codificado. La parte en el grupo de captura,

([\x00-\x7F] | [\xC0-\xDF][\x80-\xBF] | [\xE0-\xEF][\x80-\xBF]{2} | [\xF0-\xF7][\x80-\xBF]{3}) 

... más o menos coincide con una secuencia de bytes UTF-8 válidos, que puede ser de uno a cuatro bytes de longitud. El valor del primer byte determina cuánto tiempo debe ser esa secuencia de bytes particular.

Como la sustitución es simplemente '$1', las secuencias de bytes válidas se enchufarán nuevamente en la salida. Cualquier byte que no coincida con esa parte coincidirá con el punto (.) y se eliminará de manera efectiva.

Lo más importante que debes saber sobre esta técnica es que nunca deberías tener que usarla. Si encuentra secuencias de bytes UTF-8 no válidas en su texto codificado en UTF-8, significa una de dos cosas: no es realmente UTF-8, o está dañado. En lugar de "limpiarlo", debe averiguar cómo se ensucia y reparar ese problema.

+0

Aunque tienes razón, no siempre es posible limpiar tu entrada antes de que llegue a PHP. Acabo de encontrar el problema que el código anterior resuelve cuando utilizo una herramienta externa para procesar un archivo de Excel que volvió como una cadena JSON. Como el decodificador PHP JSON se descomprime en caracteres que no sean UTF, es necesario que se eliminen, lo que el código anterior funciona bastante bien. – Danack

Cuestiones relacionadas