4
votes

Supprimer toutes les balises de la chaîne

J'ai une chaîne qui est saisie par l'utilisateur. Ils peuvent ajouter autant de liens qu'ils lient, mais nous voulons seulement que certains utilisateurs puissent cliquer sur un lien. Ce que j'essaie de faire, c'est de remplacer une balise par juste le texte à l'intérieur. J'ai réussi à le faire s'il y a un lien mais je ne peux pas comprendre comment le faire quand il y en a plusieurs.

C'est ce que j'ai actuellement et j'ai essayé de nombreuses variantes pour y arriver:

XXX

Mais cela ne fonctionne que pour la première instance d'une balise.

La chaîne que je reçois ressemble à ceci:

text = <div>blah blah blah.<br /><br /></div>\r\n<div><a href=\"http://www.google.com\">Google</a><br />Another link: <br /> <a href=\"http://www.test.com\">Test Link</a><br /><br /></div>"

Je veux qu'il dise: bla bla bla. Google Un autre lien: Lien de test

Toute aide sera appréciée. Faites-moi savoir si vous avez besoin de plus de code ou d'informations.


4 commentaires

Obligatoire .... NE PAS PARSE HTML AVEC REGEX . TH̘Ë͖́̉ ͠P̯͍̭O̚ N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝S̨̥̫͎̭ͯ̿̔̀ͅ Votre code ne fonctionnera probablement pas correctement pour tous les cas marginaux, et c'est généralement une très mauvaise idée de laisser les utilisateurs saisir du HTML arbitraire comme celui-ci - vous vous laissez ouvert à XSS attaques.


Une bien meilleure idée serait de mettre explicitement sur liste blanche des balises HTML spécifiques (peut-être avec des listes différentes pour différents utilisateurs), en utilisant un analyseur HTML. Pas de regex. edgeapi.rubyonrails.org/classes/ActionView/Helpers/ … - Cette méthode est probablement tout ce dont vous avez besoin.


@TomLord - Bon point, c'est pourquoi je demandais en pensant qu'il devait y avoir un meilleur moyen. Ce ne sont que les super utilisateurs qui peuvent y entrer et cela vient de tinymce donc ils n'ajoutent pas eux-mêmes le HTML.


L'utilisation d'un éditeur WYSIWYG ne vous protège pas contre les utilisateurs malveillants. Vous pouvez toujours soumettre des données arbitraires dans le formulaire. Mais si vous faites entièrement confiance aux utilisateurs, alors (comme pour la plupart des choses) la sécurité est moins un problème.


3 Réponses :


5
votes

Vous pouvez utiliser strip_tags code > (pour supprimer toutes les balises) ou strip_links (pour supprimer uniquement les liens).

Dans la console Rails:

> text = '<div>blah blah blah.<br /><br /></div>\r\n<div><a href=\"http://www.google.com\">Google</a><br />Another link: <br /> <a href=\"http://www.test.com\">Test Link</a><br /><br /></div>'
=> "<div>blah blah blah.<br /><br /></div>\\r\\n<div><a href=\\\"http://www.google.com\\\">Google</a><br />Another link: <br /> <a href=\\\"http://www.test.com\\\">Test Link</a><br /><br /></div>"
> helper.strip_tags(text)
=> "blah blah blah.\\r\\nGoogleAnother link:  Test Link"


1 commentaires

Je suis allé avec strip_links car je veux garder les autres balises là-dedans. Merci!



2
votes

@mrzasa semble l'avoir craqué, mais si vous vous demandez pourquoi l'expression régulière n'a pas fonctionné, c'est parce qu'elle est trop gourmande.

Utiliser l'opérateur paresseux ? signifie un scan renvoie le moins de caractères possible des critères.

Ce qui suit ajoute des opérateurs paresseux à la recherche, et je pense que cela fonctionne comme vous l'aviez prévu:

text = "<div>blah blah blah.<br /><br /></div>\r\n<div><a href=\"http://www.google.com\">Google</a><br />Another link: <br /> <a href=\"http://www.test.com\">Test Link</a><br /><br /></div><div>blah blah blah.<br /><br /></div>\r\n<div><a href=\"http://www.google.com\">Google</a><br />Another link: <br /> <a href=\"http://www.test.com\">Test Link</a><br /><br /></div>"
text.gsub(/<a.*?>(.+?)<\/a>/, '\1')

# => "<div>blah blah blah.<br /><br /></div>\r\n<div>Google<br />Another link: <br /> Test Link<br /><br /></div><div>blah blah blah.<br /><br /></div>\r\n<div>Google<br />Another link: <br /> Test Link<br /><br /></div>"

'\ 1' comme deuxième argument de gsub remplace simplement par la première correspondance.

J'espère que cela est d'une certaine manière utile, et donne une option flexible si vous préférez utiliser regex.


3 commentaires

il vaut mieux utiliser un jeu de caractères limité que des opérateurs paresseux: / ] *> ([^ <] +) <\ / a> / . Je l'ai décrit dans un article de blog


Ah, super, merci @mrzasa, appréciez les commentaires. Je vais lire votre lien et me mettre en œuvre à l'avenir.


Bien, laissez des commentaires sur support si vous avez des questions, je me ferai un plaisir d'y répondre!



3
votes

Utilisez l'assistant de rails

ActionView::Base.full_sanitizer.sanitize('text = <div>blah blah blah.<br /><br /></div>\r\n<div><a href=\"http://www.google.com\">Google</a><br />Another link: <br /> <a href=\"http://www.test.com\">Test Link</a><br /><br /></div>"
')

"text = blah blah blah.\\r\\nGoogleAnother link:  Test Link\"\n" 


0 commentaires