javascript 正则表达式替换,如何提供正则表达式条件(和标志)作为变量而不是内联?

标签 javascript regex replace

用JS的regex替换函数,会有几十条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>")
;

为了使其更易读和更易于管理(即更容易通过在一个地方而不是每一行更改它来更改正则表达式模式或标志),尝试将替换正则表达式条件和替换标志移出到一个单独的变量中:

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 替换调用或 regex/flags 变量的声明有什么问题? :-)

谢谢!

最佳答案

我会使用查找对象将原件映射到 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 次出现的版本。可以找演示here :

// 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);

关于javascript 正则表达式替换,如何提供正则表达式条件(和标志)作为变量而不是内联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14114662/

相关文章:

javascript - VueJS 忽略全局导入

javascript - 使用 ng-repeat 提供多个按钮

javascript - 当用户点击后退按钮或刷新页面时如何保留应用的搜索过滤器?

Python:用列表中的第 i 个元素替换第 n 次出现的 x

Javascript 替换输入上的按键

javascript - 为什么更改 <a> 元素的 href 在报价机上不起作用

JavaScript RegEx 集团

java - Extract 通过正则表达式连接字符串中的变量

java - 使用 .equals 方法进行正则表达式字符串匹配

linux - 在 Linux 上用 6 GB 文件中的硬制表符替换空格字符