simplexml_load_file remove htmlentities html_entity_decode especiales ent_quotes ejemplo convertir caracteres php xml

php - remove - simplexml_load_file ejemplo



Generando documento XML en PHP(caracteres de escape) (10)

¿Qué pasa con la función htmlspecialchars() ?

htmlspecialchars($input, ENT_QUOTES | ENT_XML1, $encoding);

Nota: el indicador ENT_XML1 solo está disponible si tiene PHP 5.4.0 o superior.

htmlspecialchars() con estos parámetros reemplaza los siguientes caracteres:

  • & (ampersand) se convierte en &
  • " (comillas dobles) se convierte en "
  • '' (comilla simple) se convierte en '
  • < (menor que) se convierte en &lt;
  • > (mayor que) se convierte en &gt;

Puede obtener la tabla de traducción utilizando la función get_html_translation_table() .

Estoy generando un documento XML a partir de un script PHP y necesito escapar de los caracteres especiales XML. Sé la lista de personajes que deberían escapar; pero, ¿cuál es la forma correcta de hacerlo?

¿Deben escapar los personajes solo con barra invertida (/ '') o cuál es la forma correcta? ¿Hay alguna función PHP incorporada que pueda manejar esto por mí?


Basado en la solución de sadeghj el siguiente código funcionó para mí:

/** * @param $arr1 the single string that shall be masked * @return the resulting string with the masked characters */ function replace_char($arr1) { if (strpos ($arr1,''&'')!== FALSE) { //test if the character appears $arr1=preg_replace(''/&/'',''&amp;'', $arr1); // do this first } // just encode the if (strpos ($arr1,''>'')!== FALSE) { $arr1=preg_replace(''/>/'',''&gt;'', $arr1); } if (strpos ($arr1,''<'')!== FALSE) { $arr1=preg_replace(''/</'',''&lt;'', $arr1); } if (strpos ($arr1,''"'')!== FALSE) { $arr1=preg_replace(''/"/'',''&quot;'', $arr1); } if (strpos ($arr1,''/''')!== FALSE) { $arr1=preg_replace(''//'/'',''&apos;'', $arr1); } return $arr1; }


Creé una función simple que escapa con las cinco "entidades predefinidas" que están en XML:

function xml_entities($string) { return strtr( $string, array( "<" => "&lt;", ">" => "&gt;", ''"'' => "&quot;", "''" => "&apos;", "&" => "&amp;", ) ); }

Ejemplo de uso Demo :

$text = "Test &amp; <b> and encode </b> :)"; echo xml_entities($text);

Salida:

Test &amp;amp; &lt;b&gt; and encode &lt;/b&gt; :)

Se puede lograr un efecto similar al usar str_replace pero es frágil debido a las sustituciones dobles (no probado, no recomendado):

function xml_entities($string) { return str_replace( array("&", "<", ">", ''"'', "''"), array("&amp;", "&lt;", "&gt;", "&quot;", "&apos;"), $string ); }


El escapado correcto es la forma de obtener una salida XML correcta, pero necesita manejar escapes de forma diferente para atributos y elementos . (Esa es la respuesta de Tomás es incorrecta).

Escribí / robé un código Java hace un tiempo que diferencia entre el atributo y el elemento que escapa. La razón es que el analizador XML considera todo el espacio en blanco especial, particularmente en los atributos.

Debe ser trivial trasladar eso a PHP (puede usar el enfoque de Tomás Jancik con el escape apropiado anterior). No debe preocuparse por el escape de entidades extendidas si usa UTF-8 .

Si no quiere portar mi código Java, puede ver XMLWriter que se basa en secuencias y usa libxml, por lo que debería ser muy eficiente.


Intenté resolver el problema de la entidad XML, resolver de esta manera:

htmlspecialchars($value, ENT_QUOTES, ''UTF-8'')


Para tener un texto XML final válido, debe escapar de todas las entidades XML y tener el texto escrito en la misma codificación que el documento XML-instrucciones de procesamiento (la "codificación" en la línea <?xml ). Los caracteres acentuados no necesitan escaparse mientras estén codificados como el documento.

Sin embargo, en muchas situaciones, simplemente escapando de la entrada con htmlspecialchars puede conducir a entidades de doble codificación (por ejemplo, &eacute; se convertiría en &amp;eacute; ), así que sugiero decodificar entidades html primero:

function xml_escape($s) { $s = html_entity_decode($s, ENT_QUOTES, ''UTF-8''); $s = htmlspecialchars($s, ENT_QUOTES, ''UTF-8'', false); return $s; }

Ahora debe asegurarse de que todos los caracteres acentuados sean válidos en la codificación del documento XML. Recomiendo encarecidamente codificar siempre la salida XML en UTF-8, ya que no todos los analizadores XML respetan la codificación de instrucciones de procesamiento de documentos XML. Si su entrada puede provenir de un utf8_encode() caracteres diferente, intente usar utf8_encode() .

Hay un caso especial, cuya entrada puede venir de una de estas codificaciones: ISO-8859-1, ISO-8859-15, UTF-8, cp866, cp1251, cp1252 y KOI8-R - PHP los trata a todos lo mismo, pero hay algunas pequeñas diferencias en ellos, algunas de las cuales incluso iconv() no pueden manejar. Solo pude resolver este problema de codificación al complementar el comportamiento de utf8_encode() :

function encode_utf8($s) { $cp1252_map = array( "/xc2/x80" => "/xe2/x82/xac", "/xc2/x82" => "/xe2/x80/x9a", "/xc2/x83" => "/xc6/x92", "/xc2/x84" => "/xe2/x80/x9e", "/xc2/x85" => "/xe2/x80/xa6", "/xc2/x86" => "/xe2/x80/xa0", "/xc2/x87" => "/xe2/x80/xa1", "/xc2/x88" => "/xcb/x86", "/xc2/x89" => "/xe2/x80/xb0", "/xc2/x8a" => "/xc5/xa0", "/xc2/x8b" => "/xe2/x80/xb9", "/xc2/x8c" => "/xc5/x92", "/xc2/x8e" => "/xc5/xbd", "/xc2/x91" => "/xe2/x80/x98", "/xc2/x92" => "/xe2/x80/x99", "/xc2/x93" => "/xe2/x80/x9c", "/xc2/x94" => "/xe2/x80/x9d", "/xc2/x95" => "/xe2/x80/xa2", "/xc2/x96" => "/xe2/x80/x93", "/xc2/x97" => "/xe2/x80/x94", "/xc2/x98" => "/xcb/x9c", "/xc2/x99" => "/xe2/x84/xa2", "/xc2/x9a" => "/xc5/xa1", "/xc2/x9b" => "/xe2/x80/xba", "/xc2/x9c" => "/xc5/x93", "/xc2/x9e" => "/xc5/xbe", "/xc2/x9f" => "/xc5/xb8" ); $s=strtr(utf8_encode($s), $cp1252_map); return $s; }




Use las clases DOM para generar su documento XML completo. Manejará codificaciones y decodificaciones que ni siquiera nos importan.

Editar: Esto fue criticado por @Tchalvak:

El objeto DOM crea un documento XML completo, no se presta fácilmente a la codificación de una cadena por sí mismo.

Lo cual es incorrecto, DOMDocument puede mostrar correctamente solo un fragmento, no todo el documento:

$doc->saveXML($fragment);

lo que da:

Test &amp; <b> and encode </b> :) Test &amp;amp; &lt;b&gt; and encode &lt;/b&gt; :)

como en:

$doc = new DOMDocument(); $fragment = $doc->createDocumentFragment(); // adding XML verbatim: $xml = "Test &amp; <b> and encode </b> :)/n"; $fragment->appendXML($xml); // adding text: $text = $xml; $fragment->appendChild($doc->createTextNode($text)); // output the result echo $doc->saveXML($fragment);

Ver Demo


function replace_char($arr1) { $arr[]=preg_replace(''>'',''&gt'', $arr1); $arr[]=preg_replace(''<'',''&lt'', $arr1); $arr[]=preg_replace(''"'',''&quot'', $arr1); $arr[]=preg_replace(''/''',''&apos'', $arr1); $arr[]=preg_replace(''&'',''&amp'', $arr1); return $arr; }