2010-02-24 3 views
2

Je dois remplacer des liens en html:Regex pour remplacer les liens html vers des URL en texte clair

<a href="http://example.com"></a> 

à juste adresse url texte brut:

http://example.com 

UPD. Quelques précisions ici, j'ai besoin de cela pour enlever les balises html du texte mais conserver les emplacements des liens. C'est purement pour un usage interne, donc il n'y aura pas de code de cas folle. La langue est python dans ce cas, mais je ne vois pas comment cela est pertinent.

+6

Si vous devez manipuler HTML, ne pas utiliser une expression régulière. –

+0

Pouvez-vous être certain que ce qui se passe en tant qu'argument est juste un ou y aura-t-il d'autres bits? – Layke

+0

Trop ambigu. Quelle langue, environnement? –

Répondre

1
>>> s="""blah <a href="http://example.com"></a> blah <a href="http://www.google.com">test</a>""" 
>>> import re 
>>> pat=re.compile("<a\s+href=\"(.*?)\">.*?</a>",re.M|re.DOTALL|re.I) 
>>> pat.findall(s) 
['http://example.com', 'http://www.google.com'] 
>>> pat.sub("\\1",s) 
'blah http://example.com blah http://www.google.com' 

pour des opérations plus complexes, utilisez BeautifulSoup

+2

Cela ne fonctionnera pas s'il y a d'autres attributs dans vos balises d'ancrage ... et si vous essayez de les loger, votre regex deviendra rapidement hors de contrôle. – Nicole

+0

simple et cela fonctionne. Merci –

0

Au lieu d'utiliser regex, vous pouvez essayer d'utiliser unlink avec minidom

+0

um, comment ça marcherait ici? :) –

2

Comme je l'ai dit, si vous êtes ok avec quelques erreurs et/ou ont une certaine quantité de contrôle sur l'entrée, vous pouvez faire quelques compromis dans l'exhaustivité et utiliser Regex. Étant donné que votre mise à jour indique que c'est le cas, voici une expression rationnelle qui devrait fonctionner pour vous:

/<a\s(?:.(?!=href))*?href="([^"]*)"[^>]*?>(.*?)</a>/gi 
  • $: Le HREF
  • $: Tout dans la balise.

Cela gérer tous les cas de test ci-dessous, sauf les trois dernières lignes:

Hello this is some text <a href="/test">This is a link</a> and this is some more text. 
<a href="/test">Just a link on this line.</a> 
There are <a href="/test">two links </a> on <a href="http://www.google.com">this line</a>! 
Now we need to test some <a href="http://www.google.com" class="test">other attributes.</a>. They can be <a class="test" href="http://www.google.com">before</a> or after. 
Or they can be <a rel="nofollow" href="http://www.google.com" class="myclass">both</a> 
Also we need to deal with <a href="/test" class="myclass" style=""><span class="something">Nested tags and empty attributes</span></a>. 
Make sure that we don't do anything with <a name="marker">anchors with no href</a> 
Make sure we skip other <address href="/test">tags that start with a even if they are closed with an a</a> 
Lastly try some other <a href="#">types</a> of <a href="">href</a> attributes. 

Also we need to skip <a malformed tags. </a>. But <a href="#">this</a> is where regex fails us. 
We will also fail if the user has used <a href='javascript:alert("the reason"))'>single quotes for some reason</a> 
Other invalid HTML such as <a href="/link1" href="/link2">links with two hrefs</a> will have problems for obvious reasons. 
+0

excellente réponse, merci. –

Questions connexes