Há um par de maneiras diferentes para remover HTML tags
a partir de um NSString
no Cocoa
.
Uma maneira é renderizar a string em um NSAttributedString
e então capturar o texto renderizado.
Outra maneira é usar o método NSXMLDocument's
- objectByApplyingXSLTString
para aplicar uma XSLT
transformação que faça isso.
Infelizmente, o iPhone não suporta NSAttributedString
ou NSXMLDocument
. Existem muitos casos extremos e HTML
documentos malformados para que eu me sinta confortável usando regex ou NSScanner
. Alguém tem uma solução para isso?
Uma sugestão foi simplesmente procurar por caracteres de tag de abertura e fechamento; este método não funcionará, exceto em casos muito triviais.
Por exemplo, estes casos (do capítulo do Perl Cookbook sobre o mesmo assunto) quebrariam este método:
<IMG SRC = "foo.gif" ALT = "A > B">
<!-- <A comment> -->
<script>if (a<b && a>c)</script>
<![INCLUDE CDATA [ >>>>>>>>>>>> ]]>
fonte
Respostas:
Uma solução rápida e "suja" (remove tudo entre <e>), funciona com iOS> = 3.2:
Eu declarei isso como uma categoria do NSString.
fonte
Esta
NSString
categoria usa oNSXMLParser
para remover com precisão quaisquerHTML
tags de umNSString
. Este é um único.m
e.h
de arquivos que podem ser incluídos em seu projeto facilmente.https://gist.github.com/leighmcculloch/1202238
Em seguida, você tira a roupa
html
fazendo o seguinte:Importe o cabeçalho:
E então chame stripHtml:
Isso também funciona com malformados
HTML
que tecnicamente não sãoXML
.fonte
funciona bem para mim
fonte
Você pode usar como abaixo
fonte
usa isto
não se esqueça de incluir isso em seu código: #import "RegexKitLite.h" aqui está o link para baixar esta API: http://regexkit.sourceforge.net/#Downloads
fonte
Dê uma olhada em NSXMLParser. É um analisador de estilo SAX. Você deve ser capaz de usá-lo para detectar tags ou outros elementos indesejados no documento XML e ignorá-los, capturando apenas texto puro.
fonte
Esta é uma solução mais eficiente do que a resposta aceita:
A
NSString
categoria acima usa uma expressão regular para encontrar todas as tags correspondentes, faz uma cópia da string original e, finalmente, remove todas as tags no local, iterando sobre elas na ordem reversa. É mais eficiente porque:Isso funcionou bem o suficiente para mim, mas uma solução usando
NSScanner
pode ser mais eficiente.Assim como a resposta aceita, esta solução não atende a todos os casos de fronteira solicitados por @lfalin. Isso exigiria uma análise muito mais cara, que o caso de uso médio provavelmente não precisa.
fonte
Sem loop (pelo menos do nosso lado):
fonte
fonte
fonte
Estendi a resposta por m.kocikowski e tentei torná-la um pouco mais eficiente usando um NSMutableString. Eu também o estruturei para uso em uma classe de Utils estática (eu sei que uma categoria é provavelmente o melhor design) e removi o autorelease para que seja compilado em um projeto ARC.
Incluído aqui, caso alguém o considere útil.
.h
.m
fonte
<(?>/?)(?!a).+?>
remover todas as tags, exceto as tags de abertura <a> e de fechamento </a>.Se você deseja obter o conteúdo sem as tags html da página da web (documento HTML), use este código dentro do método
UIWebViewDidfinishLoading
delegado .fonte
Eu imagino que a maneira mais segura seria apenas analisar para <> s, não? Faça um loop por toda a string e copie qualquer coisa que não esteja entre <> s para uma nova string.
fonte
Esta é a modernização da resposta m.kocikowski que remove os espaços em branco:
fonte
a seguir está a resposta aceita, mas em vez da categoria, é um método auxiliar simples com string passada para ele. (obrigado m.kocikowski)
fonte
Aqui está a versão rápida:
fonte
stringByReplacingOccurrencesOfString
uso fora do ciclo é codificação percentual e deve ser corrigido de forma correta.Se você deseja usar o framework Three20 , ele tem uma categoria em NSString que adiciona o método stringByRemovingHTMLTags. Consulte NSStringAdditions.h no subprojeto Three20Core.
fonte
Estendendo mais isso das respostas de m.kocikowski e Dan J com mais explicações para iniciantes
1 # Primeiro você precisa criar c-categorias objetivas para tornar o código utilizável em qualquer classe.
.h
.m
2 # Em seguida, basta importar o arquivo .h da classe de categoria que você acabou de criar, por exemplo
3 # Chamando o método.
o resultado é NSString de onde quero retirar as tags.
fonte
Segui a resposta aceita por m.kocikowski e modifiquei um pouco para usar um autoreleasepool para limpar todas as strings temporárias criadas por stringByReplacingCharactersInRange
No comentário para este método, ele afirma: / * Substitua os caracteres no intervalo pela string especificada, retornando uma nova string. * /
Portanto, dependendo do comprimento de seu XML, você pode estar criando uma grande pilha de novas strings de autorelease que não são limpas até o final do próximo @autoreleasepool. Se você não tiver certeza de quando isso pode acontecer ou se uma ação do usuário puder disparar repetidamente muitas chamadas para este método antes, você pode simplesmente encerrar em um @autoreleasepool. Eles podem até mesmo ser aninhados e usados em loops quando possível.
A referência da Apple em @autoreleasepool declara isso ... "Se você escrever um loop que cria muitos objetos temporários. Você pode usar um bloco de pool de liberação automática dentro do loop para descartar esses objetos antes da próxima iteração. Usando um bloco de pool de liberação automática no loop ajuda a reduzir a pegada máxima de memória do aplicativo. " Eu não usei no loop, mas pelo menos este método se limpa sozinho agora.
fonte
Outra maneira:
Interface:
-(NSString *) stringByStrippingHTML:(NSString*)inputString;
Implementação
Realização
cell.exampleClass.text = [self stringByStrippingHTML:[exampleJSONParsingArray valueForKey: @"key"]];
ou simples
NSString *myClearStr = [self stringByStrippingHTML:rudeStr];
fonte
Uma resposta atualizada para @ m.kocikowski que funciona nas versões recentes do iOS.
}
fonte
Aqui está uma postagem de blog que discute algumas bibliotecas disponíveis para remover HTML http://sugarmaplesoftware.com/25/strip-html-tags/ Observe os comentários onde outras soluções são oferecidas.
fonte