在Javascript函数中,我需要用/
替换不属于HTML标记的所有正斜杠。
有没有办法使用正则表达式查找>
和<
之间的所有正斜杠?
答案 0 :(得分:2)
不完全正确,但是如果您正在进行此类修复,我想您会对快速而肮脏的解决方案感到满意:如果下一个出现的尖括号不是a,请找/
关闭角括号。
result = subject.replace(/\/(?![^<>]*>)/g, "/");
当然,这非常脆弱 - 例如它根本不关心评论,字符串等(但是,用正则表达式来解决这个问题是非常困难的。)
答案 1 :(得分:1)
您可以测试一下:
html ='<a href="/sdfsdf/SD/sdfsf">toto/tata</a>';
html = html.replace(/(<[^>]+>)|\//g,
function (match, p1) { return (p1)?match:"/"; });
console.log (html);
想法是在尝试匹配斜杠之前捕获所有html标记(并自行替换)。然后回调函数测试第一个捕获组是否存在并返回完整匹配或替换。
您可以提高此模式的安全性,以处理样式和脚本内容,如下所示:
html = html.replace(/(<s(tyle|cript)\b[\s\S]*?<\/s\2>|<[^>]+>)|\//gi,
function (match, p1, p2) { return (p1)?match:"/"; });
答案 2 :(得分:0)
这是一个很好的例子。首先点击谷歌:http://james.padolsey.com/javascript/find-and-replace-text-with-javascript/
基本思想是迭代DOM中的所有节点并替换文本节点中的文本。此外,不要替换脚本,样式,元数据类型标记中的节点中的任何文本。虽然您可以使用一个大的正则表达式执行此操作,但是当每个浏览器中都内置一个dom解析器时,在regex中实现dom解析器没有多大意义。
function findAndReplace(searchText, replacement, searchNode) {
if (!searchText || typeof replacement === 'undefined') {
// Throw error here if you want...
return;
}
var regex = typeof searchText === 'string' ?
new RegExp(searchText, 'g') : searchText,
childNodes = (searchNode || document.body).childNodes,
cnLength = childNodes.length,
excludes = 'html,head,style,title,link,meta,script,object,iframe';
while (cnLength--) {
var currentNode = childNodes[cnLength];
if (currentNode.nodeType === 1 &&
(excludes + ',').indexOf(currentNode.nodeName.toLowerCase() + ',') === -1) {
arguments.callee(searchText, replacement, currentNode);
}
if (currentNode.nodeType !== 3 || !regex.test(currentNode.data) ) {
continue;
}
var parent = currentNode.parentNode,
frag = (function(){
var html = currentNode.data.replace(regex, replacement),
wrap = document.createElement('div'),
frag = document.createDocumentFragment();
wrap.innerHTML = html;
while (wrap.firstChild) {
frag.appendChild(wrap.firstChild);
}
return frag;
})();
parent.insertBefore(frag, currentNode);
parent.removeChild(currentNode);
}
}
然后使用它
findAndReplace('\\/', '/');