尝试解析一些内容(没有DOM可用 - 或DOM解析器,例如jQuery,Cheerio)用图像替换一些单词/符号(基本上是情感),但是想忽略<code></code>
之间的所有内容和<pre></pre>
这个例子非常适合取代所有的情感,但不会忽略代码和预标签
http://jsbin.com/odARehI/5/edit?js,console
如果您运行脚本,您将在代码标记之前看到第一个打印输出,第二个打印出来。
会欣赏另一组关于该模式的眼睛。感谢
// see link for a list of the emotions to parse
var pattern = />:\)|\([\w~]+\)|\\[:]?[od]\/|[:;\|bBiIxX8\(\)\]][=\-"^:]?[)>$&|\w\(\)*@#?]?[)>$&|\w\(\)*@#?]/g;
我尝试了一些在没有弄乱原始比赛的情况下无效的事情。
对于不用解析-html-with-regex-police-department :这是运行服务器端的,目前我没有奢侈的DOM解析器。
谢谢。
更新:对于忽略<code>
代码的RegExp解决方案,请参阅此github/frissdiegurke
/(^|<\/code>)([^<]*|<(?!code>))*(<code>|$)/g
答案 0 :(得分:3)
如果没有DOM解析,您将遇到失败的边缘情况。但是,这应该适合你。
鉴于此HTML:
Hello :) <pre>Wassup :)</pre> Maybe :) <code>:) Foo</code> :) Bar
使用此代码:
var blocks = [];
html = html.replace(/(?:<pre>.*?<\/pre>|<code>.*?<\/code>)/g, function (match) {
blocks.push( match );
return '__BLOCK__';
});
html = html.replace(/:\)/g, 'SMILE');
html = html.replace(/__BLOCK__/g, function () {
return blocks.shift();
});
产生:
Hello SMILE <pre>Wassup :)</pre> Maybe SMILE <code>:) Foo</code> SMILE Bar
只需根据您的需要调整/:\)/g
替换即可。
答案 1 :(得分:3)
猜猜你正在使用nodejs或最近的javascript引擎(用于“map”和“split”实现),所以你可以这样做:
function replaceSpecial(str, pattern, replacement) {
var REG = /(<code>.*?<\/code>)|(<pre>.*?<\/pre>)/i;
return str.split(REG).map(function(s) {
if ('' + s !== s)
return '';
if (s.match(REG))
return s;
return s.replace(pattern, replacement);
}).join('');
}
示例:
replaceSpecial("hey :) <code>:)</code> :'( <pre> :'( :)</pre>", /(:\))|(:'\()/, function(s) {
switch(s) {
case ":)":
return '<img src="smile.gif" />';
case ":'(":
return '<img src="cry.gif" />';
}
})
将返回:
"hey <img src="smile.gif" /> <code>:)</code> <img src="cry.gif" /> <pre> :'( :)</pre>"
如果您只想替换表情符号,则更容易:
replaceSpecial("hey :) <code>:)</code>", ":)", '<img src="smile.gif" />')
=&GT;
"hey <img src="smile.gif" /> <code>:)</code>"
答案 2 :(得分:2)
var co = -1, ce = 0, start=0, result;
while ( ce != -1 ) {
co = testString.indexOf('<code', ce);
if (co > -1) {
result += parse(testString.substring(start,co), pattern1);
start = co+1;
ce = testString.indexOf('</code>', co + 5);
if (ce >-1 ){
start = ce + 7;
ce = start;
result += testString.substring(co,ce);
}
}
}
result += parse(testString.substring(start), pattern1);
的console.log(结果);