3

コード マッチングを構築し、いくつかの種類のパターン (bbCode) を置き換えています。私が作ろうとしている一致の 1 つは、[url=http:example.com] をすべてアンカー リンクに置き換えることです。また、プレーンテキストの URL を一致させてアンカー リンクに置き換えようとしています。そして、これら2つの組み合わせで、私はいくつかの問題に直面しています.

私のルーチンは再帰的であり、実行ごとにテキスト全体を照合して置換するため、アンカーに既に含まれている URL を置換しないと問題が発生します。

これは私が実行している再帰ルーチンです:

if(text.search(p.pattern) !== -1) {
    text = text.replace(p.pattern, p.replace);
}

これは、これまでのプレーン URL の正規表現です。

/(?!href="|>)(ht|f)tps?:\/\/.*?(?=\s|$)/ig

また、URL は http または https または ftp または ftps で始まり、空白または句読点 (. / ! / ? / ,) で終わる任意のテキストをその後に含めることができます。

明確にするために、これを一致のテストとして使用しています。

一致する必要があります:

一致してはならない

ここで得られる助けがあれば、本当に感謝しています。

EDIT 以下の jkshah によって最初に受け入れられた解決策には、いくつかの欠陥があります。たとえば、それは一致します

<img src="http://www.example.com/test.jpg">

ただし、ジェリーのソリューションのコメントにより、もう一度試してみたいと思いました。そのソリューションは、この問題も解決しました。したがって、代わりにその解決策を受け入れました。これについてのあなたの親切な助けに感謝します。:)

4

3 に答える 3

3

たぶん、このようなものですか?

/(?:(?:ht|f)tps?:\/\/|www)[^<>\]]+?(?![^<>\]]*([>]|<\/))(?=[\s!,?\]]|$)/gm

そして、もしあれば、最後にドットをトリムします.

正規表現101のデモ

リンクにさらに句読点が含まれていると、いくつかの問題が発生する可能性があります...最初にリンクをキャプチャしてから、2 番目の置換で末尾の句読点を削除することをお勧めします。

[^<>\]]+を除くすべての文字と一致し<>]

(?![^<>\]]*([>]|<\/))html タグ間のリンクの一致を防ぎます。

(?=[\s!,?\]]|$)句読点と空白用です。

于 2013-09-27T21:53:01.217 に答える
0

関数にすることができp.replaceますか?もしそうなら:

var text = 'http://www.example.com \n' +
           'http://www.example.com/test \n' +
           'http://example.com/test \n' +
           'www.example.com/test \n' +
           '<a href="http://www.example.com">http://www.example.com </a>\n' +
           '<a href="http://www.example.com/test">http://www.example.com/test </a>\n' +
           '<a href="http://example.com/test">http://example.com/test </a>\n' +
           '<a href="www.example.com/test">www.example.com/test </a>';
var p = {
    flag: true,
    pattern: /(<a[^<]*<\/a>)|((ht|f)tps?:\/\/|www\.).*?(?=\s|$)/ig,
    replace: function ($0, $1) {
                 if ($1) {
                     return $0;
                 } else {
                     p.flag = true;
                     return "construct replacement string here";
                 }
    }
};
while(p.flag){
    p.flag = false;
    text = text.replace(p.pattern, p.replace);
}

私が追加した正規表現の一部は(<a[^<]*<\/a>)|、URL がアンカー内のどこかにあるかどうかを確認することです。そうであれば、置換関数はそれを無視します。

内部の URL を避けたいが<a href="...">、アンカー内の他の URL を置き換える必要がある場合は、次のように変更(<a[^<]*<\/a>)|します。(<a[^>]*>)|

于 2013-09-28T00:06:49.280 に答える