在JavaScript函数中,我需要将所有非HTML标记部分的正斜杠替换为
/
。是否有一种使用正则表达式查找在>
和<
之间的所有前向斜杠的方法?/
。是否有一种使用正则表达式查找在>
和<
之间的所有前向斜杠的方法?并不完全是这样,但如果你遇到了这种情况,我猜你会很满意一个快速而简单的解决方案:找到一个/
,如果下一个出现的尖括号不是闭合尖括号。
result = subject.replace(/\/(?![^<>]*>)/g, "/");
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:"/"; });
<![CDATA[...]]>
和<!-- ... -->
。请参见http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#tag-open-state了解HTML5的解析方式。 - Daniel Moses这里有一个很好的例子。在谷歌上的第一个搜索结果:http://james.padolsey.com/javascript/find-and-replace-text-with-javascript/
基本思路是遍历 DOM 中的所有节点并替换文本节点中的文本。此外,不要替换脚本、样式、元数据类型标签中的任何文本。虽然你可能能够使用一个大正则表达式来完成这个任务,但在每个浏览器中都内置了一个 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('\\/', '/');
(?<=...)
)。 - Casimir et Hippolyte