3

このリンクの基本的な質問に対する回答を確認しました:プレーンURLをリンクに置き換える方法は?そして、 Christian Kochが提案したコードを使用することにしましたが、それは私がしなければならないことを部分的にしかカバーしていません。ここの誰かが私を助けてくれることを願っています。

Christian Kochが提供したコードは、1つの例外を除いてうまく機能します。すでにリンクが含まれているテキストとプレーンテキストだけがある場合、それらのリンクには二重の「a」タグが付けられるため、HTMLの問題が発生し、テキストがブラウザに正しく表示されません。

たとえば、コードはこれに対して正常に機能します。

     www.yahoo.com is a website just like http://www.google.com

yahooとgoogleのテキストがリンクとして表示され、予想どおりに両方にリンクラッパーが表示されます。

     <a href="http://www.yahoo.com">www.yahoo.com</a> is a website just like <a href="http://www.google.com">http://www.google.com</a>

次に、このテキストを取得します(基本的なテキストとすでに定義されているリンクが含まれています)。

     www.yahoo.com is a website just like <a href="http://www.google.com">http://www.google.com</a>

提供されたコードを使用する場合、yahooリンクは正しいですが、googleリンクには二重タグが付いています。

     <a href="http://www.yahoo.com">www.yahoo.com</a> is a website just like <a href="<a href="http://www.google.com">http://www.google.com</a>" target="_blank"><a href="http://www.google.com">http://www.google.com</a></a>

誰かがパターンを正しくするのを手伝ってくれませんか?テキストにすでにリンクが含まれている場合、パターンはそれを無視しますが、タグのない他のテキストを置き換えます。テキストがまだリンクタグに含まれていない場合にのみ、パターンに置換を実行させたいのです。

これが私が他の投稿から使用しているコードです:

   doLinks: function(originalText) 
   {
    // http://, https://, ftp://
    var urlPattern = /\b(?:https?|ftp):\/\/[a-z0-9-+&@#\/%?=~_|!:,.;]*[a-z0-9-+&@#\/%=~_|]/gim;

    // www. sans http:// or https://
    var pseudoUrlPattern = /(^|[^\/])(www\.[\S]+(\b|$))/gim;

    // Email addresses *** here I've changed the expression ***
    var emailAddressPattern = /(([a-zA-Z0-9_\-\.]+)@[a-zA-Z_]+?(?:\.[a-zA-Z]{2,6}))+/gim;

    return originalText
        .replace(urlPattern, '<a target="_blank" href="$&">$&</a>')
        .replace(pseudoUrlPattern, '$1<a target="_blank" href="http://$2">$2</a>')
        .replace(emailAddressPattern, '<a target="_blank" href="mailto:$1">$1</a>');
}
4

2 に答える 2

2

問題をもう一度見てみると、いくつかのサブパターンを組み合わせた方が、1 つのメガパターンよりもうまくいくと信じるようになりました。そこで、pseudoUrlPattern を 2 つに分割しました。1 つは行頭の URL 用で、もう 1 つは指定されたテキスト内の他のすべての URL 用です。次の修正されたコードを検討してください。これには、私のテスト テキストが含まれています。

  var doLinks = function(originalText) {

        var urlPattern = /[^<>]\b(?:https?|ftp):\/\/[a-z0-9-+&@#\/%?=~_|!:,.;]*[a-z0-9-+&@#\/%=~_|](?![^<>])/gim;

        var pseudoUrlPattern1 = /^([^\/])?(www\.[\S]+(\b|$|[^<>]))/gim
        var pseudoUrlPattern2 = /([^\/"><])(www\.[\S]+(\b|$))(?![^<>])?/gim;

        var emailAddressPattern = /(([a-zA-Z0-9_\-\.]+)@[a-zA-Z_]+?(?:\.[a-zA-Z]{2,6}))+/gim;

        return originalText
            .replace(urlPattern, '<a target="_blank" href="$&">$&</a>')
            .replace(pseudoUrlPattern1, '$1<a target="_blank" href="http://$2">$2</a>')
            .replace(pseudoUrlPattern2, '$1<a target="_blank" href="http://$2">$2</a>')
            .replace(emailAddressPattern, '<a target="_blank" href="mailto:$1">$1</a>');
    }    

    var string = 'www.yahoo.com is a website just like <a href="http://www.google.com">http://www.google.com</a> and not like <a href="www.facebook.com "> www.facebook.com </a> and not like www.example.com';

やってみて、どうだったか教えて。

注意すべきことの 1 つは、既にアンカー タグに含まれている URL では、URL とタグの間にスペースを入れないことです。

于 2013-01-04T18:37:24.570 に答える
1

URL が引用符'または二重引用符で囲まれている場合は、置換を禁止するだけ"です。

// http://, https://, ftp://
var urlPattern = /[^"']\b(?:https?|ftp):\/\/[a-z0-9-+&@#\/%?=~_|!:,.;]*[a-z0-9-+&@#\/%=~_|]/gim;

// www. sans http:// or https://
var pseudoUrlPattern = /(^|[^\/"'])(www\.[\S]+(\b|$))/gim;

// Email addresses *** here I've changed the expression ***
var emailAddressPattern = /[^"'](([a-zA-Z0-9_\-\.]+)@[a-zA-Z_]+?(?:\.[a-zA-Z]{2,6}))+/gim;

引用符または二重引用符をエスケープする必要があるかもしれません。私はそれをテストしませんでした。

ところで、あなたの正規表現はすべてのドメイン名に一致するわけではありません。国際化されたドメイン名がますます増えています。こちらのドイツ語版ウィキペディアの例を参照してください

于 2013-01-04T18:38:47.427 に答える