JavaScript正则表达式:查找在>和<之间的斜杠

4
在JavaScript函数中,我需要将所有非HTML标记部分的正斜杠替换为&#x2F;。是否有一种使用正则表达式查找在><之间的所有前向斜杠的方法?

重复问题 https://dev59.com/RlLTa4cB1Zd3GeqPcrKj - Daniel Moses
3
@DMoses,我不相信那是重复内容。 - Charlie
这个能行吗? body_text = body_text.replace(/(?<=">")(./)(?="<")/g, "&#x2F"); - Warren Schubert
@Charlie 你说得对。那个问题甚至没有给出一个有效的答案。 - Daniel Moses
@WarrenSchubert:它无法工作,因为JavaScript正则表达式没有后顾特性(即(?<=...))。 - Casimir et Hippolyte
3个回答

2

并不完全是这样,但如果你遇到了这种情况,我猜你会很满意一个快速而简单的解决方案:找到一个/,如果下一个出现的尖括号不是闭合尖括号。

result = subject.replace(/\/(?![^<>]*>)/g, "&#x2F");

当然,这种方法非常脆弱 - 例如,它完全不考虑注释、字符串等(尚未考虑,而且使用正则表达式实现这一点会非常困难)。

谢谢,我认为这可能适用于这个应用程序;我会尝试一下。 - Warren Schubert

1
您可以测试这个:

html ='<a href="/sdfsdf/SD/sdfsf">toto/tata</a>';

html = html.replace(/(<[^>]+>)|\//g,
    function (match, p1) { return (p1)?match:"&#x2f"; });

console.log (html);

这个想法是在尝试匹配斜杠之前捕获所有的HTML标签(并将其替换为它们自己)。然后,回调函数会测试第一个捕获组是否存在,并返回完整匹配或替换。

您可以改进此模式以处理样式和脚本内容,方法如下:

html = html.replace(/(<s(tyle|cript)\b[\s\S]*?<\/s\2>|<[^>]+>)|\//gi,
    function (match, p1, p2) { return (p1)?match:"&#x2f"; });

这将替换脚本和样式标签中的“/”,从而可能导致问题。 - Daniel Moses
是的,您可能还想跳过以下内容:<![CDATA[...]]><!-- ... -->。请参见http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#tag-open-state了解HTML5的解析方式。 - Daniel Moses

0

这里有一个很好的例子。在谷歌上的第一个搜索结果: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('\\/', '&#x2F');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接