1

#の後に最初の単語の境界までのテキストが必要なjavascriptの正規表現に苦労していますが、URLの一部である場合は一致しません。それで

# test-test
sometext#test2と一致する必要があります-test2と一致する必要があります
xx moretext#test3-test3と一致する必要があります
http://test.com#tab1-tab1と一致しない必要があります

ハッシュの後のテキストをリンクに置き換えています(ただし、ハッシュ文字自体は置き換えていません)。テキストには複数のハッシュが含まれている可能性があり、それらすべてに一致する必要があります(そのために/ gを使用する必要があると思います)。

ハッシュの後の部分を一致させるのは非常に簡単です:/#\b(.+?)\b/gですが、文字列自体が「http」で始まる場合は一致しないのは解決できません。おそらくネガティブなルックアラウンドを使用する必要がありますが、それを回避するのに問題があります。

どんな助けでも大歓迎です!

4

3 に答える 3

1

JSは後読みをサポートしていないため、代わりに負の先読みを使用してこの正規表現を試してください。

/^(?!http:\/\/).*#\b(.+?)\b/

状況によっては、チェックすることもwwwできます。

編集:次に、これを行うことができます:

str = str.replace(re.exec(str)[1], 'replaced!');

http://jsfiddle.net/j7c79/2/

編集2:複雑になりすぎると、正規表現だけではうまくいかない場合があります。別のアプローチを試してください。

var txt = "asdfgh http://asdf#test1 #test2 woot#test3";

function replaceHashWords(str, rep) {
  var isUrl = /^http/.test(str), result = [];
  !isUrl && str.replace(/#\b(.+?)\b/g, function(a,b){ result.push(b); });
  return str.replace((new RegExp('('+ result.join('|') +')','g')), rep);
}

alert(replaceHashWords(txt, 'replaced!')); 
// asdfgh http://asdf#replaced! #replaced! woot#replaced!
于 2012-10-01T20:46:10.267 に答える
0

正規表現は、多くの場合(常にではないにしても)使用するのに非常に費用がかかるため、基本的な文字列と配列のメソッドを使用して、特定の文字セットがURLを表すかどうかを判断することをお勧めします(ただし、すべてのURLが開始されると想定しています)文字列付きhttp):

$('ul li').each(
    function() {
        var t = $(this).text(),
            words = t.split(/\s+/),
            foundHashes = [],
            word = '';
        for (var i = 0, len = words.length; i < len; i++) {
            word = words[i];
            if (word.indexOf('http') == -1 && word.indexOf('#') !== -1) {
                var match = word.substring(word.indexOf('#') + 1);
                foundHashes.push(match);
            }
        }
        // the following just shows what, if anything, was found
        // and can definitely be safely omitted
        if (foundHashes.length) {
            var newSpan = $('<span />', {
                'class': 'matchedWords'
            }).text(foundHashes.join(', ')).appendTo($(this));
        }
    });

JS Fiddleデモ(いくつかのタイミング情報がコンソールに出力されます)

参照:

于 2012-10-02T20:18:29.747 に答える
0

これには、JavaScriptの機能に悲しいことに欠けている、後読みが必要になります。

ただし、件名の文字列が一部のHTMLであり、それらのURLがhref属性に含まれている場合は、そこからドキュメントを作成してテキストノードを検索し、nodeValueHTML文字列全体ではなくsを置き換えるだけで済みます。

于 2012-10-01T20:33:33.360 に答える