php preg_match_all无效

时间:2017-05-19 03:52:12

标签: php regex preg-match-all

正则表达式突出显示错误的字词Hell«o»并忽略正确的字词«Hello»Hello, 所以,我的问题是我的JavaScript代码工作正常,但当我尝试它的PHP它也突出显示字符串,不应该:

  1. '«这是销售点»';
  2. 这是我的正则表达式:https://regex101.com/r/SqCR1y/14

    PHP代码:

    $re = '/^(?:.*[[{(«][^\]})»\n]*|[^[{(«\n]*[\]})»].*|.*\w[[{(«].*|.*[\]})»]\w.*)$/m';
    $str = '«This is the point of sale»';
    
    preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
    
    // Print the entire match result
    var_dump($matches);
    

    //输出

    array(1) {
      [0]=>
      array(1) {
        [0]=>
        string(29) "«This is the point of sale»"
      }
    }
    

    预期:空数组

    jsfiddle在这里,工作正常

    提前致谢

2 个答案:

答案 0 :(得分:1)

您没有使用正确的模式。试试这个:

$re = '/^
  (?:
    \([^)\n] | [^(\n]*\). |
    \[[^]\n] | [^[\n]*\]. |
    {[^}\n] | [^{\n]}.* |
    «[^»\n] | [^«\n]*». |
    .?\w[[{(«]. | .?[\]})»]\w.
  )
$/mxu';

答案 1 :(得分:0)

像“(不)平衡”字符串怎么样?这应该合法吗?

此类型的模式在您的测试输入中并不明确,但由于您的“好”字符串都不均衡,您可以考虑使用regex recursion来匹配平衡括号表达式并定位有效的字符串而不是无效字符串:

$re = '/
    ^
    (?!.*\w[{}«»\(\)\[\]]\w)  //disallow brackets inside words
    (?:
    [^\n{}«»\(\)\[\]]|      //non bracket character, OR:
    (                       //(capture group #1, the recursive subpattern) "one of the following balanced groups":
    (\((?:(?>[^\n«»\(\){}\[\]]|(?1))*)\))|  //balanced paren groups
    (\[(?:(?>[^\n«»\(\){}\[\]]|(?1))*)\])|  //balanced bracket groups
    («(?:(?>[^\n«»\(\){}\[\]]|(?1))*)»)|        //balanced chevron groups
    ({(?:(?>[^\n«»\(\){}\[\]]|(?1))*)})     //balanced curly bracket groups
    )
    )+ //repeat "non bracket character or balanced group" until end of string
    $  
/mxu';

递归采用以下形式:

[openbracket]([nonbracket] | [open/close pattern again via recursion])*[closebracket]

要以递归方式使用部分模式,您可以通过包含它的捕获组(?N)来识别它,其中N是组的编号。

*在进入递归之前,最初的否定前瞻将导致任何“字边界”违规失败

*此正则表达式看起来比原始方法快35%,如下所示:https://regex101.com/r/MBITHe/4