Utiliser Python, je veux remplacer toutes les URL dans un corps de texte avec des liens vers ces URL, comme ce que gmail fait. Peut-il être fait dans une expression régulière d'une doublure? P>
EDIT: par le corps du texte, je viens de dire un texte brut - pas de HTML P>
5 Réponses :
Vous pouvez charger le document avec une bibliothèque d'analyse DOM / HTML (voir HTML5LIB), saisissez tous les nœuds de texte, faites-les correspondre à une expression régulière et remplacez les nœuds de texte avec un remplacement de RegEx de l'URI avec des ancrages à l'aide d'une PCRE tels que:
import re urlfinder = re.compile("([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}|((news|telnet|nttp|file|http|ftp|https)://)|(www|ftp)[-A-Za-z0-9]*\\.)[-A-Za-z0-9\\.]+):[0-9]*)?/[-A-Za-z0-9_\\$\\.\\+\\!\\*\\(\\),;:@&=\\?/~\\#\\%]*[^]'\\.}>\\),\\\"]") def urlify2(value): return urlfinder.sub(r'<a href="\1">\1</a>', value)
Donc, ce qui n'est pas autorisé dans une URL?
BTW, que se passe-t-il si le lien est déjà à l'intérieur de l'attribut href d'une balise d'ancrage?
Lorsque vous êtes à l'intérieur du nœud texte, assurez-vous que le parent ou l'ancêtre n'est pas une ancre.
@Amarghosh - Le regex du codeur dicte ce qu'est une "URL" est, bien sûr, je suis d'accord avec vous que cela va être difficile en faire un qui est compatible pour tous les types d'URL, mais même le plus fondamental prendra en charge 95% des URL.
Si le REGEXP doit être: "([0-9] {1,3} \\. [0-9] {1,3} \\. [0-9] {1,3} \\. [ 0-9] {1,3} | ((Actualité | T elnet | NTTP | fichier | http | ftp | https): //) | (www | ftp) [- A-ZA-Z0-9] * \\.) [- A-ZA-Z0-9 \\.] + (: [0-9] *)? / [- A-ZA-Z0-9 _ \\ $ \\ . \\ + \\! \\ * \\ (\ \ \ \ \\) ,;: @ & = \\? / ~ \\ # \\%] * [^] '\\.}> \\ ), \\\\ "]" code>, celui-ci ne compile pas.
Lorsque vous dites "corps de texte", voulez-vous dire un fichier texte brut ou un texte de corps dans un document HTML? Si vous souhaitez que le document HTML, vous souhaitez utiliser Belle soupe pour l'analyser; Ensuite, recherchez dans le texte du corps et insérez les balises. P>
Correspondance des URL réelles est probablement la mieux effectuée avec le Module Urlparse . Discussion complète ici:
Gmail est beaucoup plus ouvert, quand il s'agit d'URL, mais ce n'est pas toujours raison non plus. par exemple. Il fera www.ab dans un lien hypertexte ainsi que http: // AB mais il échoue souvent à cause du texte enveloppé et des caractères URL inhabituels (mais valides). p>
voir ANNEXE AA collecté BNF pour URI pour la syntaxe et utiliser cela pour construire Une expression régulière raisonnable qui examinera ce qui entoure l'URL également. Vous seriez bien conseillé d'envisager quelques scénarios où les URL pourraient se retrouver. P>
/\w+:\/\/[^\s]+/
J'ai cherché beaucoup, j'ai essayé ces solutions et je n'étais pas satisfait de leur lisibilité ou de leur fonctionnalité, j'ai donc roulé les éléments suivants:
_urlfinderregex = re.compile(r'http([^\.\s]+\.[^\.\s]*)+[^\.\s]{2,}') def linkify(text, maxlinklength): def replacewithlink(matchobj): url = matchobj.group(0) text = unicode(url) if text.startswith('http://'): text = text.replace('http://', '', 1) elif text.startswith('https://'): text = text.replace('https://', '', 1) if text.startswith('www.'): text = text.replace('www.', '', 1) if len(text) > maxlinklength: halflength = maxlinklength / 2 text = text[0:halflength] + '...' + text[len(text) - halflength:] return '<a class="comurl" href="' + url + '" target="_blank" rel="nofollow">' + text + '<img class="imglink" src="/images/linkout.png"></a>' if text != None and text != '': return _urlfinderregex.sub(replacewithlink, text) else: return ''
J'ai également examiné autour de moi, y compris quelques cadres qui ont mis en œuvre leur propre fonction de liaison, et j'ai trouvé celui-ci comme étant les objectifs les plus lisibles à des fins non complexes.
Ceci est de loin le meilleur texte basé sur la regex -> script HTML que j'ai trouvé sur Stackoverflow. C'est nettement meilleur que même la réponse acceptée. J'ai seulement dû changer la ligne text = unicode (URL) code> sur
texte = str (URL) code> pour Python 3.x; et supprimez l'image de liaison.
On pourrait assumer cependant que vous êtes Création de i> HTML, puisque le texte brut n'a pas de notation spéciale d'un lien vs URL. Donc, vous convertiriez
http://blah.com/page/ref/something?param=foo code> trouvé dans votre texte brut sur
http: // b lah.com/page/ref/som Âmue? param = foo code>, oui?
Oui, il sera ensuite inséré dans un document HTML
Les réponses jusqu'à présent se sont concentrées sur la correspondance de l'URL. Que diriez-vous de le remplacer par le lien?