(?=pattern)
正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。(?!pattern)
负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

解决方案 »

  1.   

    ?= 代表后面必须有
    ?! 代表后面不能有
    ?<=代表前面必须有
    ?<!代表前面不能有
      

  2.   

    目标串
    windows 2000 is a os.表达式 => 结果
    /windows/ => window
    /windows (?=98)/ => null
    /windows (?=2000)/ => window要求,我想匹配windows,但windows后面必需是2000才行,否则这个windows就不匹配.
    windows 2000 符合
    windows 98 不符合
    注意:2000不在结果中,因为预查不消耗字符
      

  3.   

    /(windows(2000))/和这个有什么区别?
      

  4.   

    /(windows(2000))/-------------------
    When use preg_replace, you can use $1 to match "windows 2000" and $2 to match "2000" in the replacement variable.
      

  5.   

    /(windows(2000))/和这个有什么区别?2000是子匹配,预查内的字符是不被保存的
      

  6.   

    的确是只有保存与否的差别。但我感觉你对保存与否还不太理解,不然应该不会这样问。保存与否并不只是一个结果的差别。
    例如
    $str="winwinwin";
    如果你用win(win)的话,那找到第一个结果后,将从"win"开始查找下一个结果。结果只找到一个匹配。
    如果你用win(?=win)的话,那找到第一个结果后,将从"winwin"开始查找。这样共找到2个匹配。