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

在Javascript中通过PHP可能的额外字符串引号[duplicate]

  •  0
  • Rotimi  · 技术社区  · 4 年前

    我正在用HTML和JavaScript设计一个正则表达式测试程序。用户将输入正则表达式、字符串,并通过单选按钮选择要测试的函数(例如搜索、匹配、替换等),当该函数使用指定参数运行时,程序将显示结果。自然会有额外的文本框来替换额外的参数等等。

    我的问题是从用户那里获取字符串并将其转换为正则表达式。如果我说他们不需要 // 在他们输入的正则表达式周围,他们不能设置标志,比如 g i // 有没有其他方法可以让用户输入字符串进入正则表达式?我需要用 // 那我们用另一种方法来构造它?我应该让他们输入一个字符串,然后分别输入标志吗?

    0 回复  |  直到 9 年前
        1
  •  644
  •   Gumbo    15 年前

    使用 RegExp object constructor 要从字符串创建正则表达式,请执行以下操作:

    var re = new RegExp("a|b", "i");
    // same as
    var re = /a|b/i;
    
        2
  •  71
  •   Mak Anonymous    10 年前
    var flags = inputstring.replace(/.*\/([gimy]*)$/, '$1');
    var pattern = inputstring.replace(new RegExp('^/(.*?)/'+flags+'$'), '$1');
    var regex = new RegExp(pattern, flags);
    

    var match = inputstring.match(new RegExp('^/(.*?)/([gimy]*)$'));
    // sanity check here
    var regex = new RegExp(match[1], match[2]);
    
        3
  •  25
  •   Rivenfall    4 年前

    str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&')

    我是从银行拿到的 escape-string-regexp NPM模块。

    escapeStringRegExp.matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
    function escapeStringRegExp(str) {
        return str.replace(escapeStringRegExp.matchOperatorsRe, '\\$&');
    }
    
    console.log(new RegExp(escapeStringRegExp('example.com')));
    // => /example\.com/
    

    使用带标记的模板文字和标志支持:

    function str2reg(flags = 'u') {
        return (...args) => new RegExp(escapeStringRegExp(evalTemplate(...args))
            , flags)
    }
    
    function evalTemplate(strings, ...values) {
        let i = 0
        return strings.reduce((str, string) => `${str}${string}${
            i < values.length ? values[i++] : ''}`, '')
    }
    
    console.log(str2reg()`example.com`)
    // => /example\.com/u
    
        4
  •  16
  •   Ayman Hourieh    15 年前

    使用 JavaScript RegExp object constructor .

    var re = new RegExp("\\w+");
    re.test("hello");
    

        5
  •  10
  •   staabm    10 年前

    在我的例子中,用户输入有时被分隔符舍入,有时不舍入。所以我又加了一个案子。。

    var regParts = inputstring.match(/^\/(.*?)\/([gim]*)$/);
    if (regParts) {
        // the parsed pattern had delimiters and modifiers. handle them. 
        var regexp = new RegExp(regParts[1], regParts[2]);
    } else {
        // we got pattern string without delimiters
        var regexp = new RegExp(inputstring);
    }
    
        6
  •  4
  •   Richie Bendall    4 年前

    尝试使用以下函数:

    const stringToRegex = str => {
        // Main regex
        const main = str.match(/\/(.+)\/.*/)[1]
        
        // Regex options
        const options = str.match(/\/.+\/(.*)/)[1]
        
        // Compiled regex
        return new RegExp(main, options)
    }
    

    "abc".match(stringToRegex("/a/g"))
    //=> ["a"]
    
        7
  •  3
  •   Zombo    11 年前

    我建议您也为特殊标志添加单独的复选框或文本字段。这样很明显,用户不需要添加任何 // 在替换的情况下,提供 文本字段。这会让你的生活轻松很多。

    // 最后,您可能会得到一个语法上有效的regex,它与用户的意图完全不同,从而导致奇怪的行为(从用户的角度来看)。

        8
  •  2
  •   kofifus    8 年前

    当字符串无效或不包含标志等时,也可以这样做:

    function regExpFromString(q) {
      let flags = q.replace(/.*\/([gimuy]*)$/, '$1');
      if (flags === q) flags = '';
      let pattern = (flags ? q.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1') : q);
      try { return new RegExp(pattern, flags); } catch (e) { return null; }
    }
    
    console.log(regExpFromString('\\bword\\b'));
    console.log(regExpFromString('\/\\bword\\b\/gi'));
                
        9
  •  1
  •   Gene Bo Krzysztof Dziuba    9 年前

    多亏了前面的回答,这个模块可以作为一个通用的解决方案,将可配置的字符串应用到正则表达式中。。用于过滤文本:

    var permittedChars = '^a-z0-9 _,.?!@+<>';
    permittedChars = '[' + permittedChars + ']';
    
    var flags = 'gi';
    var strFilterRegEx = new RegExp(permittedChars, flags);
    
    log.debug ('strFilterRegEx: ' + strFilterRegEx);
    
    strVal = strVal.replace(strFilterRegEx, '');
    // this replaces hard code solt:
    // strVal = strVal.replace(/[^a-z0-9 _,.?!@+]/ig, '');
    
        10
  •  1
  •   Akshat Mahajan    7 年前

    var userInput = formInput;
    var flags = '';
    if(formGlobalCheckboxChecked) flags += 'g';
    if(formCaseICheckboxChecked) flags += 'i';
    var reg = new RegExp(userInput, flags);
    
        11
  •  0
  •   Tofandel    3 年前

    下面是我的一行函数,它处理自定义分隔符和无效标志

    function stringToRegex(s, m) {
      return (m = s.match(/^([\/~@;%#'])(.*?)\1([gimsuy]*)$/)) ? new RegExp(m[2], m[3].split('').filter((i, p, s) => s.indexOf(i) === p).join('')) : new RegExp(s);
    }
    
    console.log(stringToRegex('/(foo)?\/bar/i'));
    console.log(stringToRegex('#(foo)?\/bar##gi')); //Custom delimiters
    console.log(stringToRegex('#(foo)?\/bar##gig')); //Duplicate flags are filtered out
    console.log(stringToRegex('/(foo)?\/bar')); // Treated as string
    console.log(stringToRegex('gig')); // Treated as string
        12
  •  -3
  •   Playhi    5 年前

    我用 eval 解决这个问题。

    例如:

        function regex_exec() {
    
            // Important! Like @Samuel Faure mentioned, Eval on user input is a crazy security risk, so before use this method, please take care of the security risk. 
            var regex = $("#regex").val();
    
            // eval()
            var patt = eval(userInput);
    
            $("#result").val(patt.exec($("#textContent").val()));
        }