9
<textarea name="test">
  http://google.com/
  https://google.com/
  www.google.com/
  [url=http://google.com/]google.com[/url]
  text
</textarea>

テキストエリアに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 を削除する私の現在の試み:

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

現在、次のように出力されます。

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

出力を次のようにしたい:

<textarea>
  text
</textarea>
4

3 に答える 3

6

試してください(コメント後に修正および改善されました):

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

式を端から端まで剥がす:

  • アドレスには、スキーム以外に 2 つまたは 3 つの「部分」がある場合があります。
  • アドレスはwwwで始まる場合とそうでない場合があります
  • 先頭にhttp://またはhttps://を付けることができます
  • [url= ...]...[/url]で囲んでもかまいません。

この式は、完全に正しい構文を強制するものではありません。これは、記述するのがはるかに難しい正規表現です。
あなたが望むかもしれないいくつかの改善:

1.空間意識

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

2.最後の部分にドットを強制しない

value = value.replace(/^(\[url=)?(https?:\/\/)?(www\.|\S+?\.)(\S+?\.)?[^.\s]+$\s*/mg, '');
于 2013-02-23T19:47:57.553 に答える
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',-]./)) {

まず、複数の関数呼び出しを使用して textarea の値を 3 回取得するよりも、チェックの前に変数に格納する方がよいでしょう。つまり、

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

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

.*in/^http([s]?):\/\/.*/は、0 個以上の文字に一致するため、何の役にも立ちません。の([s]?)方が良いs?です。

では/^www.[0-9a-zA-Z',-]./.リテラルに一致するようにエスケープする必要が.あります。つまり\.、文字クラス内の複数の文字に一致することを意味していると思われるため、その後に を付ける必要があります+

実際の一致が必要ない場合testよりもRegExp メソッドを使用する方が効率的であるため、上記を組み合わせて、match

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

チェックは呼び出し自体replaceに暗黙的に含まれているため、を呼び出す必要があるかどうかを判断するためにのみ使用している場合は、チェックの意味はほとんどありません。replace

行頭にhttp[s]://ある ,[urlまたはwww., で始まる非スペース文字の文字列を削除するという単純な基準を使用すると、次のように使用できます。

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

URL をどこにでも表示できる場合は\b、 の代わりに単語の境界を意味するを使用し、フラグ^を削除します。m

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

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

有効な URL がテキストエリアのどこにでも表示され他の文字で囲まれている場合、完全な解決策はありません。

于 2013-02-23T19:49:55.837 に答える