with texto strip_tags remove limpiar from eliminar allow php regex pcre

php - texto - string strip_tags



regex(en PHP) para que coincida y que no sean entidades HTML (5)

Este es el objetivo: reemplazar todos los signos y signos independientes con & amp; pero NO reemplace aquellos que ya son parte de una entidad HTML como & nbsp ;.

Creo que necesito una expresión regular para PHP (preferiblemente para las funciones preg_) que coincida solo con los signos y símbolos independientes. Simplemente no sé cómo hacer eso con preg_replace.


Los otros son buenas sugerencias, y podría ser una mejor manera de hacerlo. Pero pensé que trataría de responder la pregunta como se me había pedido, aunque solo fuera para proporcionar un ejemplo de expresiones regulares.

La siguiente es la forma especial de explosión permitida en algunos motores. Por supuesto, lo extraño es que un motor que permite expresiones regulares comentadas permite otras expresiones simplificadas, pero no tan genéricas. Pondré esas expresiones simplificadas en parens en los comentarios.

& # an ampersand ( /# # a ''#'' character [1-9] # followed by a non-zero digit, [0-9]{1,3} # with between 2 and 4 (/d{1,3} or /p{IsDigit}{1,3}) | [A-Za-z] # OR a letter (/p{IsAlpha}) [0-9A-Za-z]+ # followed by letters or numbers (/p{IsAlnum}+) ) ; # all capped with a '';''

Incluso podría lanzar un grupo de entidades esperadas allí para ayudar al escáner de expresiones regulares.

& # an ampersand ( amp | apos | gt | lt | nbsp | quot # standard entities | bull | hellip | [lr][ds]quo | [mn]dash | permil # some fancier ones | /# # a ''#'' character [1-9] # followed by a non-zero digit, [0-9]{1,3} # with between 2 and 4 | [A-Za-z] # OR a letter [0-9A-Za-z]+ # followed by letters or numbers ) ; # all capped with a '';''


Ross me llevó a una buena respuesta. Aquí está el código que parece funcionar bastante bien. Hasta aquí. :-) El objetivo, una vez más, es convertir HTML a XML, específicamente descripciones de fuentes RSS. En la breve prueba que he hecho hasta ahora (con algunos datos bastante bastante extravagantes) he podido tomar cadenas envueltas en CDATA y desenvolverlo. Pases pruebas de validación Gracias, Ross.

//decode all entities $string=html_entity_decode($string,ENT_COMPAT,''UTF-8''); //entity-encode only &<> and double quotes $string=htmlspecialchars($string,ENT_COMPAT,''UTF-8'');


Las htmlentities() de PHP htmlentities() tienen double_encode argumento double_encode para esto.

Si quieres hacer cosas como esas en expresiones regulares, las aserciones negativas son útiles:

preg_replace(''/&(?![a-z#]+;)/i'',''&amp;'',$txt);


Tuve el mismo problema, estaba usando originalmente:

$string = htmlspecialchars($string, ENT_QUOTES, "UTF-8", FALSE);

Pero necesitaba que funcionara con PHP4 y una combinación de CharSets, que terminó con:

function htmlspecialchars_custom($string) { $string = str_replace("/x05/x06", "", $string); $string = preg_replace("/&([a-z/d]{2,7}|#/d{2,5});/i", "/x05/x06$1", $string); $string = htmlspecialchars($string, ENT_QUOTES); $string = str_replace("/x05/x06", "&", $string); return $string; }

No es perfecto, pero es lo suficientemente bueno para mis necesidades.


¿Siempre podría ejecutar html_entity_decode antes de ejecutar htmlentities ? Funciona, a menos que solo desee hacer símbolos de unión (e incluso entonces puede jugar con los parámetros del juego de caracteres).

Mucho más fácil y más rápido que una expresión regular.