Javascript - 正则表达式/替换优化

标签 javascript regex replace sanitization

<分区>

我有一个脚本,它允许替换不需要的 HTML 标签和转义引号以“提高”安全性并主要防止脚本标签和加载注入(inject)等......该脚本用于“纹理化”从 检索的内容innerHTML.

但是,它几乎是我执行时间的 3 倍(在一个循环中)。我想知道是否有更好的方法或更好的正则表达式来做到这一点:

function safe_content( text ) {

    text = text.replace( /<script[^>]*>.*?<\/script>/gi, '' );
    text = text.replace( /(<p[^>]*>|<\/p>)/g, '' );
    text = text.replace( /'/g, '&#8217;' ).replace( /&#039;/g, '&#8217;' ).replace( /[\u2019]/g, '&#8217;' );
    text = text.replace( /"/g, '&#8221;' ).replace( /&#034;/g, '&#8221;' ).replace( /&quot;/g, '&#8221;' ).replace( /[\u201D]/g, '&#8221;' );
    text = text.replace( /([\w]+)=&#[\d]+;(.+?)&#[\d]+;/g, '$1="$2"' );
    return text.trim();

};

编辑: 这里有一个 fiddle :https://fiddle.jshell.net/srnoe3s4/1/ . Fiddle 显然不喜欢 javascript 字符串中的 script 标签,所以我没有添加它。

最佳答案

我将只处理性能和简单的安全检查,因为编写 sanitizer 不是您可以在 table Angular 落做的事情。如果你想节省时间,避免多次调用 replace() 如果你用相同的值替换,这会导致你这样做:

function safe_content( text ) {
    text = text.replace( /<script[^>]*>.*?<\/script>|(<\/?p[^>]*>)/gi, '' );
    text = text.replace( /'|&#039;|[\u2019]/g, '&#8217;');
    text = text.replace( /"|&#034;|&quot;|[\u201D]/g, '&#8221;' )
    text = text.replace( /([\w]+)=&#[\d]+;(.+?)&#[\d]+;/g, '$1="$2"' );
    return text.trim();
};

如果你考虑到 dan1111 关于奇怪的字符串输入的评论会破坏这个实现,你可以添加 while(/foo/.test(input)) 来避免这个问题:

function safe_content( text ) {
    while(/<script[^>]*>.*?<\/script>|(<\/?p[^>]*>)/gi.test(text))
        text = text.replace( /<script[^>]*>.*?<\/script>|(<\/?p[^>]*>)/gi, '' );
    while(/'|&#039;|[\u2019]/g.test(text))
        text = text.replace( /'|&#039;|[\u2019]/g, '&#8217;');
    while(/"|&#034;|&quot;|[\u201D]/g.test(text))
        text = text.replace( /"|&#034;|&quot;|[\u201D]/g, '&#8221;' )
    while(/([\w]+)=&#[\d]+;(.+?)&#[\d]+;/g.test(text))
        text = text.replace( /([\w]+)=&#[\d]+;(.+?)&#[\d]+;/g, '$1="$2"' );
    return text.trim();
};

在标准测试用例中,这不会比之前的代码慢很多。但是如果输入在dan1111的注释范围内,可能会比较慢。参见 perf demo

关于Javascript - 正则表达式/替换优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43539050/

相关文章:

replace - 如何在 Notepad++ 中用另一列值替换一列值

jquery - 单击按钮时替换文本区域中的文本

javascript - ng-repeat 渲染并自动滚动到底部

javascript - Angular2中的循环依赖问题

正则表达式删除包含确切数量分号的行,Notepad++

regex - Perl 正则表达式交替

mysql - SQL 将 select 中的内容替换为左连接

javascript - 如何通过 JavaScript 中的文本内容选择 HTML "<option>"的选定 "<select>"?

javascript - React 组件中的 Prop 发生了变化

python - 将带有嵌入式括号的字符串转换为字典