Hay un par de formas diferentes de eliminar HTML tags
un archivo NSString
in Cocoa
.
Una forma es convertir la cadena en un NSAttributedString
y luego tomar el texto renderizado.
Otra forma es usar NSXMLDocument's
- objectByApplyingXSLTString
método para aplicar una XSLT
transformación que lo haga.
Desafortunadamente, el iPhone no es compatible con NSAttributedString
o NSXMLDocument
. Hay demasiados casos extremos y HTML
documentos mal formados para que me sienta cómodo usando expresiones regulares o NSScanner
. ¿Alguien tiene una solución para esto?
Una sugerencia ha sido simplemente buscar caracteres de etiqueta de apertura y cierre, este método no funcionará excepto en casos muy triviales.
Por ejemplo, estos casos (del capítulo del libro de recetas de Perl sobre el mismo tema) romperían este método:
<IMG SRC = "foo.gif" ALT = "A > B">
<!-- <A comment> -->
<script>if (a<b && a>c)</script>
<![INCLUDE CDATA [ >>>>>>>>>>>> ]]>
fuente
Respuestas:
Una solución rápida y "sucia" (elimina todo entre <y>), funciona con iOS> = 3.2:
Tengo esto declarado como una categoría de NSString.
fuente
Esta
NSString
categoría utilizaNSXMLParser
para eliminar con precisión cualquierHTML
etiqueta de unNSString
. Se trata de un único.m
y.h
archivos que se pueden incluir en su proyecto fácilmente.https://gist.github.com/leighmcculloch/1202238
Luego te desnudas
html
haciendo lo siguiente:Importar el encabezado:
Y luego llame a stripHtml:
Esto también funciona con malformados
HTML
que técnicamente no lo sonXML
.fuente
funciona bien para mi
fuente
Puedes usar como a continuación
fuente
utilizar este
no olvide incluir esto en su código: #import "RegexKitLite.h" aquí está el enlace para descargar esta API: http://regexkit.sourceforge.net/#Downloads
fuente
Eche un vistazo a NSXMLParser. Es un analizador de estilo SAX. Debería poder usarlo para detectar etiquetas u otros elementos no deseados en el documento XML e ignorarlos, capturando solo texto puro.
fuente
Aquí hay una solución más eficiente que la respuesta aceptada:
La
NSString
categoría anterior usa una expresión regular para encontrar todas las etiquetas coincidentes, hace una copia de la cadena original y finalmente elimina todas las etiquetas en su lugar iterando sobre ellas en orden inverso. Es más eficiente porque:Esto funcionó bastante bien para mí, pero el uso de una solución
NSScanner
podría ser más eficiente.Al igual que la respuesta aceptada, esta solución no aborda todos los casos fronterizos solicitados por @lfalin. Esos requerirían un análisis mucho más costoso que el caso de uso promedio probablemente no necesite.
fuente
Sin bucle (al menos de nuestro lado):
fuente
fuente
fuente
Extendí la respuesta de m.kocikowski y traté de hacerla un poco más eficiente utilizando NSMutableString. También lo estructuré para usarlo en una clase de Utils estática (aunque sé que una Categoría es probablemente el mejor diseño), y eliminé el lanzamiento automático para que se compile en un proyecto ARC.
Incluido aquí por si alguien lo encuentra útil.
.h
.metro
fuente
<(?>/?)(?!a).+?>
esto eliminará todas las etiquetas, excepto las etiquetas de apertura <a> y cierre </a>.Si desea obtener el contenido sin las etiquetas html de la página web (documento HTML), utilice este código dentro del método
UIWebViewDidfinishLoading
delegado .fuente
Me imagino que la forma más segura sería analizar para <> s, ¿no? Recorra toda la cadena y copie todo lo que no esté entre <> sa una nueva cadena.
fuente
Esta es la modernización de la respuesta de m.kocikowski que elimina los espacios en blanco:
fuente
la siguiente es la respuesta aceptada, pero en lugar de la categoría, es un método de ayuda simple con una cadena pasada. (gracias m.kocikowski)
fuente
Aquí está la versión rápida:
fuente
stringByReplacingOccurrencesOfString
usa fuera del ciclo es una codificación porcentual y debe corregirse de una manera correcta.Si está dispuesto a usar el marco Three20 , tiene una categoría en NSString que agrega el método stringByRemovingHTMLTags. Consulte NSStringAdditions.h en el subproyecto Three20Core.
fuente
Ampliando esto más de las respuestas de m.kocikowski y Dan J con más explicación para los novatos
1 # Primero tienes que crear categorías-c-objetivo para que el código sea utilizable en cualquier clase.
.h
.metro
2 # Luego simplemente importe el archivo .h de la clase de categoría que acaba de crear, por ejemplo
3 # Llamar al método.
El resultado es NSString del que quiero quitar las etiquetas.
fuente
Seguí la respuesta aceptada por m.kocikowski y la modifiqué ligeramente para hacer uso de un autoreleasepool para limpiar todas las cadenas temporales creadas por stringByReplacingCharactersInRange
En el comentario de este método dice, / * Reemplaza los caracteres en el rango con la cadena especificada, devolviendo una nueva cadena. * /
Por lo tanto, dependiendo de la longitud de su XML, es posible que esté creando una gran pila de nuevas cadenas de liberación automática que no se limpian hasta el final del siguiente @autoreleasepool. Si no está seguro de cuándo puede suceder eso o si la acción de un usuario podría desencadenar repetidamente muchas llamadas a este método antes, puede resumir esto en un @autoreleasepool. Estos incluso se pueden anidar y usar dentro de bucles siempre que sea posible.
La referencia de Apple en @autoreleasepool dice lo siguiente ... "Si escribe un bucle que crea muchos objetos temporales. Puede usar un bloque de grupo de liberación automática dentro del bucle para deshacerse de esos objetos antes de la siguiente iteración. Usar un bloque de grupo de liberación automática en el bucle ayuda a reducir la huella máxima de memoria de la aplicación ". No lo he usado en el ciclo, pero al menos este método se limpia después de sí mismo ahora.
fuente
Otra forma:
Interfaz:
-(NSString *) stringByStrippingHTML:(NSString*)inputString;
Implementación
Realización
cell.exampleClass.text = [self stringByStrippingHTML:[exampleJSONParsingArray valueForKey: @"key"]];
o simple
NSString *myClearStr = [self stringByStrippingHTML:rudeStr];
fuente
Una respuesta actualizada para @ m.kocikowski que funciona en versiones recientes de iOS.
}
fuente
Aquí hay una publicación de blog que analiza un par de bibliotecas disponibles para eliminar HTML http://sugarmaplesoftware.com/25/strip-html-tags/ Tenga en cuenta los comentarios donde se ofrecen otras soluciones.
fuente