37 votes

Détecter une URL ou un lien (vilain ou gentil) dans une chaîne de texte

Comment puis-je détecter (avec des expressions régulières ou heuristiques) un lien de site web dans une chaîne de caractères de texte comme un commentaire?

Le but est d'éviter le spam. HTML est dépouillé, donc j'ai besoin de détecter des invitations à des copier-coller. Il ne devrait pas être rentable pour un spammeur de poster des liens parce que la plupart des utilisateurs ne pouvaient pas réussi à se mettre à la page. J'aimerais des suggestions, des références, ou des discussions sur les meilleures pratiques.

Certains objectifs:

  • La faible fruits mûrs comme bien formé Url (http://some-fqdn/some/valid/path.ext)
  • Url mais sans l' http:// préfixe (c'est à dire un nom de domaine complet valide + HTTP valide chemin)
  • Toute autre activité amusante

Bien sûr, je suis blocage du spam, mais le même processus pourrait être utilisé pour l'auto-texte du lien.

Des idées

Voici quelques choses je pense.

  • Le contenu est natif de la langue de la prose, donc je peux être à la gâchette facile dans la détection
  • Dois-je éliminer tous les espaces tout d'abord, saisir "www .example.com"? Serait commun aux utilisateurs de savoir à supprimer l'espace eux-mêmes, ou de faire toute les navigateurs "faire ce que je veux dire" et la bande pour vous?
  • Peut-être que plusieurs passages est une meilleure stratégie, avec des scans pour:
    • Bien formé Url
    • Tous les non-blanc, suivi par '.' suivi d'un valide TLD
    • Quelque chose d'autre?

Questions Connexes

J'ai lu ces derniers et ils sont maintenant documentés ici, de sorte que vous pouvez simplement les références les regexes dans ces questions si vous le souhaitez.

Mise à jour et le Résumé

Wow, j'ai il y a quelques très bonnes heuristiques énumérés ici! Pour moi, le meilleur bang-pour-le-mâle est une synthèse de ce qui suit:

  1. @Jon Lumineux de la technique de détection des Tld (une bonne défensive goulet d'étranglement)
  2. Pour ceux suspect chaînes, remplacer le point par un point-à la recherche de caractères comme par @capar
  3. Un bon point-à la recherche de caractères est @Sharkey est indicée · (c "·"). &midot; est aussi une limite de mot de sorte qu'il est plus difficile de désinvolture, copier et coller.

Que doit faire un spammeur de CPM de faible suffisant pour mes besoins; le "signaler comme inapproprié" les commentaires des utilisateurs doit attraper quoi que ce soit d'autre. D'autres solutions énumérées sont également très utiles:

  • Bande toutes les pointillés-quads (@Sharkey commentaire sa propre réponse)
  • @Sporkmonger de l'exigence de Javascript côté client, qui insère un nécessaire champ caché dans le formulaire.
  • Une requête ping à l'URL serveur-côté pour établir s'il est un site web. (Je pourrais peut-être exécuter le code HTML par SpamAssassin ou un autre filtre Bayésien comme par @Nathan..)
  • En regardant de google Chrome source pour son smart barre d'adresse pour voir quels trucs astucieux Google utilise
  • Appeler à l'OWASP AntiSAMY ou d'autres services web à des fins de spam/détection de logiciels malveillants.

19voto

Jon Bright Points 6834

Je me concentre ma réponse sur le fait d'essayer d'éviter les spammeurs. Cela conduit à deux sous-hypothèses: les personnes qui utilisent le système sera donc activement en essayant de contrevenir à votre chèque et votre but est seulement de détecter la présence d'une URL, de ne pas extraire l'URL complète. Cette solution aurait l'air différent si votre objectif est quelque chose d'autre.

Je pense que votre meilleur pari est d'aller pour être avec le TLD. Il y a deux lettres de cctld et l' (actuellement) rapport comparativement petite liste des autres. Ces le besoin d'être précédé par un point et suffixé par une barre oblique ou certains frontière de mot. Comme d'autres l'ont noté, ce n'est pas d'être parfait. Il n'y a aucun moyen d'obtenir "buyfunkypharmaceuticals . "sans l'interdiction de la légitime "j'ai essayé de nouveau. il ne fonctionne pas" ou similaire. Tout ce qui est dit, ce serait ma suggestion:

[^\b]\.([a-zA-Z]{2}|aero|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel)[\b/]

Les choses de cette obtiendrez:

Il sera bien sûr pause dès que les gens commencent à affaiblir leurs Url, de remplacer les "." par " dot ". Mais, encore une fois en supposant que les spammeurs sont votre objectif ici, s'ils commencent à faire ce genre de chose, leur taux de clics allez laisser tomber un ou deux ordres de grandeur vers zéro. L'ensemble des personnes suffisamment informé pour deobfuscate une URL et de l'ensemble des personnes mal informées suffisamment à visiter les sites de spam ont, je pense, un minuscule intersection. Cette solution vous permettra de détecter toutes les Url qui sont des copier-pasteable de la barre d'adresse, tout en gardant des dommages collatéraux à un strict minimum.

13voto

CMS Points 315406

6voto

Nathan Reed Points 3192

Je ne suis pas sûr si la détection d'Url avec une regex est la bonne façon de résoudre ce problème. Habituellement, vous manquez une sorte d'obscur bord de cas que les spammeurs seront en mesure d'exploiter s'ils sont assez motivés.

Si votre but est juste de filtrer le spam de commentaires, alors vous voudrez peut-être penser Bayésienne de filtrage. Il s'est avéré pour être très précis pour repérer des email comme spam, il pourrait être en mesure de faire de même pour vous, en fonction du volume de texte vous avez besoin de filtrer.

6voto

Arnold Spence Points 12759

Je sais que cela n’aide en rien le texte de lien automatique, mais que se passera-t-il si vous recherchez et remplacez toutes les périodes de point par un caractère qui ressemble à la même chose, tel que le caractère unicode du point hébreu hiriq (U + 05B4)?

Le paragraphe suivant est un exemple:

Cela pourrait fonctionner ִ La période semble un peu étrange mais elle est toujours lisible ִ L'avantage bien entendu est que quiconque copie et colle www google ִ com ne va pas trop loin ִ :)

4voto

Benson Points 10705

Bon, évidemment, les fruits mûrs sont des choses qui commencent par http:// et www. En essayant de filtrer des choses comme "www . g mail . com" conduit à d'intéressantes questions philosophiques sur la façon dont la mesure vous voulez aller. Voulez-vous prendre la prochaine étape et filtrer "www dot gee mail dot com" aussi? Comment sur les descriptions abstraites d'une URL, comme "L'abréviation de world wide web, suivi d'un point, suivi par la lettre g, suivi par le mot mail, suivi d'un point, conclu avec les TLD abréviation à des fins commerciales".

Il est important de tracer la ligne de quelles sortes de choses que vous allez essayer de filtrer avant de continuer à essayer de concevoir un algorithme. Je pense que la ligne doit être tracée au niveau où "gmail.com" est considérée comme une url, mais "de gmail. com" ne l'est pas. Sinon, vous êtes susceptible d'avoir des faux positifs à chaque fois que quelqu'un ne parvient pas à mettre en majuscule la première lettre d'une phrase.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X