代码之家  ›  专栏  ›  技术社区  ›  okoman

javascript regexp对象

  •  3
  • okoman  · 技术社区  · 17 年前

    我尝试用JavaScript编写一个简单的降价解析器。所以我想检查一下 [link content][link id] 语法。我使用以下代码:

    data = data.replace( /\[(.*?)\][ ]*\[([0-9]+)\]/g, '<a href="$2">$1</a>' );
    

    它工作得很好,但是现在我想用一个regexp对象来完成这项工作。所以我设置了以下代码位:

    var r = new RegExp( '\[(.*?)\][ ]*\[([0-9]+)\]', 'g' );
    data = data.replace( r, '<a href="$2">$1</a>' );
    

    但它不起作用。它甚至说,我的正则表达式(在第一个示例中起作用)是无效的:

    不匹配)在正则表达式中

    我想这一定与我不知道的一些regexp对象特性有关。 我做错了什么?怎么解决这个问题?

    5 回复  |  直到 12 年前
        1
  •  13
  •   Sean Bright Sean Stinehour    12 年前

    因为regexp构造函数的第一个参数是字符串,而不是模式文本,所以必须转义反斜杠,因为您希望模式中有文字反斜杠:

    var r = new RegExp( '\\[(.*?)\\][ ]*\\[([0-9]+)\\]', 'g' );
    
        2
  •  1
  •   bobince    17 年前

    除了模式的反斜杠问题之外,这:

    data = data.replace( r, '<a href="$2">$1</a>' );
    

    可能很危险。我假设您已经处理了HTML转义,因此我无法执行此操作:

    [<script>stealCookies()</script>][http://oops.example.com/]
    [hover me][http://hello" onmouseover="stealCookies()]
    

    但是你仍然需要检查URL是一个已知的好方案,所以我不能这样做:

    [click me][javascript:stealCookies()]
    

    您可能需要使用该方法的string.replace(r,func)变量,并在替换中包含验证,使其成为“func”。

        3
  •  0
  •   chills42    17 年前
    var r = /\[(.*?)\][ ]*\[([0-9]+)\]/g;
    data = data.replace( r, '<a href="$2">$1</a>' );
    
        4
  •  0
  •   Quassnoi    17 年前

    双重逃避你的反斜杠:

    var r = new RegExp( '\\[(.*?)\\][ ]*\[([0-9]+)\\]', 'g' );
    
        5
  •  0
  •   meouw    17 年前

    你需要双重逃脱:

    var r = new RegExp( '\\[(.*?)\\][ ]*\\[([0-9]+)\\]', 'g' )