2013-02-23 1 views
9
<textarea name="test"> 
    http://google.com/ 
    https://google.com/ 
    www.google.com/ 
    [url=http://google.com/]google.com[/url] 
    text 
</textarea> 

Ma tentative actuelle de vérification de l'existence d'une URL dans la zone de texte.Détection et suppression des URL de la zone de texte

if ($('textarea[name="test"]').val().indexOf('[url') >= 0 || 
    $('textarea[name="test"]').val().match(/^http([s]?):\/\/.*/) || 
    $('textarea[name="test"]').val().match(/^www.[0-9a-zA-Z',-]./)) { 

Cela ne semble pas fonctionner complètement pour vérifier l'une des URL ci-dessus - je me demande comment il peut être optimisé. Il semble très bâclé et piraté en ce moment et j'espère que quelqu'un peut donner un aperçu.

Ma tentative actuelle à supprimer les URL de la zone de texte:

var value = $('textarea[name="test"]').val(); 
    value = value.replace(/\[\/?url([^\]]+)?\]/g, ''); 
$('textarea[name="test"]').val(value); 

En ce moment, il affichera:

<textarea> 
    http://google.com/ 
    https://google.com/ 
    www.google.com/ 
    google.com 
    text 
</textarea> 

Ce que je voudrais ma sortie à:

<textarea> 
    text 
</textarea> 
+0

duplication possible de [Regex pour faire correspondre URL] (http://stackoverflow.com/questions/1141848/regex-to-match-url) – JJJ

+0

N'oubliez pas de faire cette vérification sur le côté serveur aussi. Javascript peut être désactivé sur le client. – ZippyV

+0

@ZippyV J'essaie juste d'améliorer mon script côté client; Les vérifications PHP sont déjà en vigueur. –

Répondre

6

Essayez (Corrigé et amélioré après commentaires):

value = value.replace(/^(\[url=)?(https?:\/\/)?(www\.|\S+?\.)(\S+?\.)?\S+$\s*/mg, ''); 

Peeling l'expression d'un bout à commencer:

  • Une adresse peut avoir deux ou trois 'parties', en plus du système
  • Une adresse peut commencer par www ou non
  • Il peut être précédé par http: // ou https: //
  • Il peut être enfermé à l'intérieur [url = ...] ... [/ url]

Cette expression n'applique pas la pleine syntaxe correcte, qui est d'écrire un regex beaucoup plus difficile.
Quelques améliorations que vous voudrez peut-être:

1.Awareness des espaces

value = value.replace(/^\s*(\[\s*url\s*=\s*)?(https?:\/\/)?(www\.|\S+?\.)(\S+?\.)?\S+\s*$\s*/mg, ''); 

2.Enforce pas de points sur la dernière partie

value = value.replace(/^(\[url=)?(https?:\/\/)?(www\.|\S+?\.)(\S+?\.)?[^.\s]+$\s*/mg, ''); 
+0

Malheureusement javascript ne supporte la syntaxe en mode multiligne '(? m)' en ligne. – MikeM

+0

@MikeM le '(? M)' était pour l'amour du char de nouvelle ligne à la fin. Je suppose que si vous l'omettez, vous devriez au moins voir les lignes cibles remplacées, mais pas le retour à la ligne. Sauf si jquery est multiligne par défaut, auquel cas il devrait fonctionner correctement. – ilomambo

+0

Pour le mode multiligne, ajoutez le 'm' à la fin de la regex, comme avec' g'. Au moment où votre code renvoie une erreur de 'quantificateur invalide' à cause du '(? M'. – MikeM

2

En ce qui concerne votre tentative de vérifier s'il y a un URL dans la zone de texte.

if ($('textarea[name="test"]').val().indexOf('[url') >= 0 || 
    $('textarea[name="test"]').val().match(/^http([s]?):\/\/.*/) || 
    $('textarea[name="test"]').val().match(/^www.[0-9a-zA-Z',-]./)) { 

Tout d'abord, plutôt que d'obtenir la valeur textarea trois fois en utilisant la fonction plusieurs appels, il serait préférable de le stocker dans une variable avant la vérification, soit

var value = $('textarea[name="test"]').val(); 

Le /^http([s]?):\/\/.*/, en raison de la ^ sera ne correspond que si le "http: // ..." est trouvé au début de la valeur textarea. La même chose s'applique à la ^www.. L'ajout de l'indicateur multiligne m à la fin de l'expression régulière ferait ^ correspondre au début de chaque ligne, plutôt que juste le début de la chaîne.

Le .* dans /^http([s]?):\/\/.*/ ne sert à rien car il correspond à zéro ou plusieurs caractères. Le ([s]?) est meilleur que s?.

En /^www.[0-9a-zA-Z',-]./, les . a besoin d'être backslashé pour une . littérale si telle est votre intention, à savoir \., et je suppose que vous voulez dire correspondre plus d'un des personnages de la classe de caractères de sorte que vous devez suivre avec +.

Il est plus efficace d'utiliser la méthode RegExp test plutôt que match lorsque les matchs réels ne sont pas nécessaires, donc, en combinant ce qui précède, vous pourriez avoir

if (/^(\[url|https?:\/\/|www\.)/m.test(value)) { 

Il y a peu de point dans le contrôle de toute façon si vous ne l'utilisez pour décider si vous avez besoin d'appeler replace, parce que le chèque est implicite dans le même

appel replace en utilisant les critères simples que les chaînes de caractères non-espace au début d'une ligne et commençant par http[s]://, [url ou www., doivent être enlevés, vous pouvez utiliser

value = value.replace(/^(?:https?:\/\/|\[url|www\.)\S+\s*/gm, ''); 

Si les urls peuvent apparaître partout où vous pouvez utiliser \b, ce qui signifie limite de mot, au lieu de ^, et enlever le drapeau m.

value = value.replace(/(?:\bhttps?:\/\/|\bwww\.|\[url)\S+\s*/g, ''); 

Ce serait un gaspillage d'efforts pour essayer d'offrir une meilleure solution regex sans détails précis de ce que les formes d'URL peuvent apparaître dans la zone de texte, où ils peuvent apparaître et quels personnages peuvent les jouxtent.

Si une URL valide peut apparaître partout dans la zone de texte et être entouré par des autres personnages qu'il n'y a pas de solution étanche à l'eau.

+0

Vous ne traitez pas, commodément, avec l'ajout du formulaire 'mail.google.com', donc si ce sont des adresses possibles, votre regex ne fonctionnera pas. – ilomambo

Questions connexes