SQL - Supprimer toutes les balises HTML dans une chaîne de caractères
Dans mon dataset, j'ai un champ qui stocke le texte marqué avec HTML. Le grand format est comme suit:
<html><head></head><body><p>My text.</p></body></html>
Je pourrais tenter de résoudre le problème en procédant comme suit:
REPLACE(REPLACE(Table.HtmlData, '<html><head></head><body><p>', ''), '</p></body></html>')
Cependant, ce n'est pas une règle stricte que certaines des entrées de briser les Normes W3C et ne comprennent pas <head>
tags par exemple. Pire encore, il pourrait être absent des balises de fermeture. Donc j'aurais besoin d'inclure le REPLACE
fonction pour chaque ouverture et la balise de fermeture qui puisse exister.
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
Table.HtmlData,
'<html>', ''),
'</html>', ''),
'<head>', ''),
'</head>', ''),
'<body>', ''),
'</body>', ''),
'<p>', ''),
'</p>', '')
Je me demandais si il y avait un meilleur moyen d'atteindre ce que l'utilisation de plusieurs imbriquée REPLACE
fonctions. Malheureusement, les seules langues que j'ai à disposition dans cet environnement SQL et Visual Basic (pas .NET).
Imbriquée
REPLACE
est presque le même comme une boucle (de performance). Je voudrais créer un 2-dimensions de la matrice de la tenue des paires de balises HTML et en boucle sur la chaîne d'essayer de remplacer les balises. L'avantage est que vous pouvez modifier (enrichir) le tableau sans modification de votre code.Je suis totalement d'accord avec Tim. Aussi, ce qui va vous arriver si vous avez ramenks, javascript ou un bloc de style à l'intérieur de votre code html? vous allez voir comme une partie du contenu, je doute que c'est ce que vous voulez...
J'aimerais la mettre en œuvre, mais ce qui se passe dans un rapport SSRS donc, la meilleure option que j'ai serait Visual Basic... Frissonner. Il y a au moins, une garantie qu'il n'y aura pas de JavaScript ou CSS.
Selon la plate-forme que vous sélectionnez (SQL, JAVA ,VBA , FORTRAN...) de paradigme que j'ai présenté ci-dessus feraient le travail de garder de la souplesse.
OriginalL'auteur dkmann | 2016-08-10
Vous devez vous connecter pour publier un commentaire.
Mise à jour de chaînes avec unclosed tags:
Mann veuillez fournir toute l'exemple d'un tags
L'une de ces possibles sont:
<html><head></head><body><p>My text.<br>More text.</p></body></html>
, ou<html><head></head><body><p>My text.</p></html>
.Mann veuillez vérifier la mise à jour. BTW, très bonne question 😉
Merci @Devart cela résout le problème sans créer une fonction et en traitant les non appariés balises. Excellente solution.
OriginalL'auteur Devart
Si le code HTML est bien formé, alors il n'y a pas besoin d'utiliser le remplacer pour parser XML.
Les jeter ou de les convertir en un type XML et d'obtenir une valeur(s).
Voici un exemple de sortie le texte de toutes les balises:
Noter qu'il y a une différence dans la sortie de l'espace entre cast et convert.
Pour obtenir uniquement le contenu d'un nœud spécifique, la XQuery syntaxe est utilisée. (XQuery est basé sur la syntaxe XPath)
Par exemple:
Résultat :
My text.
Bien sûr, cela suppose un XML valide.
Si par exemple, une balise de fermeture est manquant, alors cela poserait un
XML parsing
erreur.Si le HTML n'est pas bien formé, comme XML, alors que l'on pourrait utiliser PATINDEX & sous-CHAÎNE pour obtenir la première balise p. Et puis l'appliquer à un type XML pour obtenir la valeur.
ou via un funky façon récursive:
.value
et l'utilisation de XPATH. Mais malheureusement, je n'ai besoin d'inégalée balises.Ouais, ce serait génial si tsql a une méthode standard pour transformer une merde HTML de type XML sans échec. C'est moins un problème si vous êtes la personne de générer le HTML car vous pouvez alors assurez-vous que le HTML est bien formé à partir du début.
Malheureusement, je n'ai pas de contrôle sur l'état de l'HTML, il est créé à partir de notre système ERP. L'utilisateur tape dans un texte de plusieurs lignes de champ et il est automatiquement formaté en HTML de base. Il est parfois difficile de prévoir ce qui peut en sortir. Même valide HTML a fermeture automatique des balises qui peut être écrit comme:
<br>
, où ce serait XML non valide.Ajout d'une alternative qui ne fera que de l'extrait de la première balise p avant la fonte.
OriginalL'auteur LukStorms
Tout d'abord créer une fonction définie par l'utilisateur que des bandes de l'HTML comme si:
Lorsque vous essayez de sélectionner:
Ce qui devrait conduire à vous éviter d'avoir à utiliser plusieurs imbriquée remplacer consolidés.
De crédit et plus d'info: http://blog.sqlauthority.com/2007/06/16/sql-server-udf-user-defined-function-to-strip-html-parse-html-no-regular-expression/
Merci pour la citation des sources, toujours importante. C'est une bonne solution, je ne pouvez avoir qu'un seul a accepté de répondre.
Pas de problème, @DanMann. Heureux que vous avez eu quelque chose qui a travaillé pour résoudre votre problème!
Cela peut être fait beaucoup plus facile, sans
WHILE
boucle à l'aide d'un tableau de modèles à remplacer (beaucoup plus facile à maintenir btw)OriginalL'auteur cp50
Encore une solution, il suffit de démontrer une astuce pour remplacer le nombre de valeurs d'un tableau (facile à entretenir!!!) dans un état unique:
--ajouter tout remplacent les modèles ici:
Cette fonction permettra de réaliser le "truc"
--Tous les exemples que j'ai trouvé dans votre question et dans les commentaires
--c'est le réel de la requête
--Clean-Up
Mise à JOUR
Si vous ajoutez un remplacement de la valeur au modèle de table, vous pourriez même utiliser différentes valeurs de remplacement comme remplacer un
<br>
, avec un saut de ligne...@Content
très utile dans certains cas 🙂OriginalL'auteur Shnugo
C'est juste un exemple. Vous pouvez utiliser ce script pour rmeove tous les tags html:
OriginalL'auteur Ranjana Ghimire
C'est la façon la plus simple.
OriginalL'auteur StackUser
De mentionner le XML n'est pas toujours valable, mais il contient toujours l' <p> et </p> balises?
Dans ce cas, la suivante devrait fonctionner:
Pour trouver toutes les positions d'un <p> dans une page HTML, il y a déjà un bon post ici: https://dba.stackexchange.com/questions/41961/how-to-find-all-positions-of-a-string-within-another-string
Sinon, je suggère l'utilisation de Visual Basic, comme vous l'avez mentionné, qui est également une option.
<p>
balises. Cependant, il ya une limite à ce que vous avez écrit si je tombe sur ceci:<html><head></head><body><p>My text.</p><p>Another paragraph</p></body></html>
Édité ma réponse et ajout d'un lien sur la façon de résoudre le cas où vous avez plus d'une balise de paragraphe.
OriginalL'auteur Zsuzsa