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

現在、テキストエリアにURLがあるかどうかをチェックしています。テキストエリアからURLを検出して削除する

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',-]./)) { 

これは、上記のURLのチェックには完全には機能していないようです。最適化の方法は不思議です。それは現時点では非常に控えめでハッキングされているようで、うまくいけば誰かがある程度の洞察力を発揮することができます。テキストエリアからURLを除去するのに

私の現在の試み:

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

私は私の出力がなりたいもの::

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

、それの出力は以下となります

<textarea> 
    text 
</textarea> 
+0

[正規表現と一致する正規表現](http://stackoverflow.com/questions/1141848/regex-to-match-url) – JJJ

+0

サーバサイドでもこのチェックを行うことを忘れないでください。 Javascriptはクライアント上で無効にすることができます。 – ZippyV

+0

@ ZippyVクライアント側のスクリプティングをより良くしようとしています。 PHPチェックは既に有効です。 –

答えて

6

試行(コメント後に修正され、改善されました):

開始するエンドからの発現を剥離
value = value.replace(/^(\[url=)?(https?:\/\/)?(www\.|\S+?\.)(\S+?\.)?\S+$\s*/mg, ''); 

  • スキーム
  • アドレスがWWW
  • で始まる可能性があるほか、アドレスが2つまたは3つの「部品」を持っているかもしれません
  • 私はで前もってお待ちくださいhttp://またはhttps://
  • それは、[URL = ...] ... [/ URL]この式は、完全な正しい構文を強制しません

が、それを書くのは非常に厳しい正規表現での内部に封入することができます。
したいかもしれないいくつかの改善点:スペース

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

2.Enforceの

1.Awarenessがあるかどうかのチェックであなたの試みについては最後の部分

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

残念ながら、JavaScriptはありませんインライン '(?m)'の複数行モード構文をサポートしています。 – MikeM

+0

@MikeM '(?m)'は最後に改行文字のためのものでした。私はあなたがそれを残しておけば、改行されたものではなく、改行された行を少なくとも見るべきだと思う。 jqueryがデフォルトでは複数行でない場合は、うまく動作するはずです。 – ilomambo

+0

複数行モードの場合、 'g'のように正規表現の最後に' m'を追加します。 – MikeM

2

上のドットなしテキストエリアのURL。なぜなら^意志の

まず
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',-]./)) { 

、むしろ複数の機能を使用してテキストエリアの値を3回取得するよりもチェックする前に変数に格納した方が良いだろう、それを呼び出し、すなわち

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

/^http([s]?):\/\/.*/、 textarea値の先頭に「http:// ...」がある場合にのみ一致します。同じことが^www.にも当てはまります。正規表現の末尾に複数行フラグmを追加すると、文字列の先頭ではなく、各行の先頭に一致するようになります(^)。

/^http([s]?):\/\/.*/.*は、0文字以上の文字と一致するため、目的を果たせません。 ([s]?)s?の方が優れています。

/^www.[0-9a-zA-Z',-]./

、それはあなたの意図であるならばリテラル.に一致するようにエスケープする.ニーズ、すなわち\.、と私はあなたがそれを実行する必要がありので、文字クラス内の文字以上のいずれかに一致することを意味と仮定+となります。

それは実際の一致が必要とされていないときのRegExp test方法ではなく、matchを使用する方が効率的であるので、上記を組み合わせて、あなたは

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

を持つことができ、チェックに少しポイントがあれば、とにかくありチェックがreplaceコール自体

に潜在的に含まれているので、あなただけの行の先頭に非空白文字の文字列の簡単な基準を使用してから始まる、あなたがreplaceを呼び出す必要があるかどうかを決定するためにそれを使用しています0、[urlまたはwww.は、除去しなければならないURLはどこでもあなたの代わりに^の、単語の境界を意味し、\bを使用し、mフラグを削除する可能性が現れることができる場合は、

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

を使用することができます。

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

これは、URLの形式は、彼らが表示されることがあり、どのような文字がそれらに隣接するテキストエリアに表示されるかもしれないものの正確な詳細なしに、より良い正規表現のソリューションを提供しようとする努力の無駄になります。

場合は任意の有効なURLはどこでもテキストエリアに表示されることができ、何の水密性ソリューションが存在しないよりも、どの他の文字に囲まれて。

+0

あなたは 'mail.google.com'という形式のアドレスを扱うのは便利ではありません。もしそれらが可能なアドレスであれば、あなたの正規表現は動作しません。 – ilomambo

関連する問題