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

当正则表达式有转义符时在php中重写javascript正则表达式

  •  0
  • jcubic  · 技术社区  · 7 年前

    我试图将regex编写为string(它是s-Expression标记器的一部分,首先对string、正则表达式和lisp注释进行拆分,然后对它们之间的内容进行标记),它在 https://regex101.com/r/nH4kN6/1/ 但是将它作为php的字符串写入时有问题。

    我的JavaScript正则表达式如下所示:

    var pre_parse_re = /("(?:\\[\S\s]|[^"])*"|\/(?! )[^\/\\]*(?:\\[\S\s][^\/\\]*)*\/[gimy]*(?=\s|\(|\)|$)|;.*)/g;
    

    $pre_parse_re = "%(\"(?:\\[\\S\\s]|[^\"])*\"|/(?! )[^/\\]*(?:\\[\\S\\s][^/\\]*)*/[gimy]*(?=\\s|\\(|\\)|$)|;.*)%";
    

    我的投入

    '(";()" /;;;/g baz); (baz quux)'
    

    调用时:

    $parts = preg_split($pre_parse_re, $str, -1,
                        PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
    

    它应该创建与Regex101中相同的数组(3个匹配项和3个匹配项之间的内容),但它会在regex中的第一个分号上继续拆分 /;;;/g

    1 回复  |  直到 7 年前
        1
  •  2
  •   braza    7 年前

    我认为你的逃跑可能是不正确的。请改为使用此正则表达式:

    $pre_parse_re = "%(\"(?:\\\\[\\\\S\\\\s]|[^\"])*\"|\/(?! )[^\/\\\\]*(?:\\\\[\S\s][^\/\\\\]*)*\/[gimy]*(?=\s|\(|\)|$)|;.*)%";
    

    使用 preg_split 可能还会返回比所需的捕获组更多的组,因此如果只需要3个匹配项,也可以更改为使用此选项。

    $parts;
    preg_match_all($pre_parse_re, $str, $parts, PREG_SET_ORDER, 0);