1

JSのreplace関数を正規表現で使用すると、数十のreplaceステートメントが含まれます。

var NewHTML = OriginalHTML
.replace(/\bJavaScript\b/gi, "<a href=\"http://js.com/\">$&</a>")
.replace(/\bMySQL\b/gi, "<a href=\"http://www.mysql.com/\">$&</a>")
;

読みやすく管理しやすくするために(つまり、すべての行ではなく1か所で変更することで正規表現パターンまたはフラグを簡単に変更できるように)、正規表現の置換条件を取得してフラグを別の変数に置き換えようとします。

var pattern = /\b(?!\-)(?!\/)\b(?!\-)/gi;

var NewHTML = OriginalHTML
.replace("JavaScript", "<a href=\"http://js.com/\">$&</a>", pattern)
.replace("MySQL", "<a href=\"http://www.mysql.com/\">$&</a>", pattern)    

問題は、インライン呼び出しが完全に無視されていることです...正規表現部分とフラグ部分の両方。

誰かがJS置換呼び出しまたは正規表現/フラグ変数の宣言の何が問題になっているのかを見つけることができますか?:-)

ありがとう!

4

3 に答える 3

3

ルックアップオブジェクトを使用して、オリジナルをURLにマップします。

// Original string
var o = "MySql is a DBMS, whereas javascript is a client side scripting language";

//Patterns
var patterns = {
    "javascript": "http://js.com/",
    "mysql": "http://www.mysql.com/"
};

//Constructing regex
RegExp.escape= function(s) {
    return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
};
var keys = [];
for (i in patterns) {
    if (patterns.hasOwnProperty(i)) {
        keys.push(RegExp.escape(i));
    }
}
var pattern = new RegExp("\\b(" + keys.join("|") + ")\\b", "gi");

//Replace
var n = o.replace(pattern, function(m, g1) {
    return "<a href='" + patterns[g1.toLowerCase()] + "'>" + g1 + "< /a>";
});
console.log(n);

これがデモンストレーションです:http://jsfiddle.net/qP9Er/


編集:

あなたの要求に従って、これは最初のn回の出現を置き換えるバージョンです。ここでデモンストレーションを見つけることができます:

// Original string
var o = '<p>Test 1 (JavaScript - <strong>1st keyword instance to be replaced</strong>): <br><a href="http://js1.net">Link to JavaScript site (existing URL)</a> is a scripting language commonly implemented as part of a web browser in order to create enhanced user interfaces and dynamic websites. JavaScript is very flexible.</p><p>more text here... and another mention of JavaScript. also javascript and JAVAScrIPT <br><br></p><p>Test 2 (MySQL - <strong>1st keyword instance to be replaced</strong>): <br><a href="http://www.mysql.com">MySQL</a>  (existing URL) is the most popular open-source database system.</p> <p><a href="http://www.themysqllink.com">link to a MySQL site</a> (existing URL).</p><p> More stuff about Mysql, also mysql and mySQL</p>';

//Patterns
var patterns = {
    "javascript": "http://js.com/",
    "mysql": "http://www.mysql.com/",
    "mention": "http://www.x.com/"
};

//Number of replacements
var num = 1;

//Constructing regex
RegExp.escape = function(s) {
    return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
};
var keys = [];
for (key in patterns) {
    if (patterns.hasOwnProperty(key)) {
        keys.push(RegExp.escape(key));
    }
}
var regexen = [];
for (var i = 0; i < keys.length; i++) {
    regexen[i] = new RegExp("\\b(" + keys[i] + ")\\b(?![^<]*?<\/a>)", "i");
}

//Replace
for (var i = 0; i < regexen.length; i++) {
    var count = 0;
    var pattern = regexen[i];
    while (count < num) {
        o = o.replace(pattern, function(m, g1) {
            return "<a href='" + patterns[g1.toLowerCase()] + "'>" + g1 + "</a>";
        });
        count++;
    }
}
document.write(o);
于 2013-01-01T22:13:42.230 に答える
2

この.replace()関数は2つの引数のみを取ります。

正規表現を文字列として作成し、コンストラクターに渡すことで、正規表現を動的に作成できますRegExp()

于 2013-01-01T22:06:52.987 に答える
1

flagsパラメータは非標準です。さらに重要なのは、「gi」などのフラグのみにタグを付け、正規表現全体にはタグを付けないことです。

重複を処理するためのループを作成します。または、文字列を作成する関数を使用して、文字列を1か所に保持できるようにします。

于 2013-01-01T22:14:28.923 に答える