<?php/**
 *
 *
 * @version $Id$
 * @copyright 2009
 */
$input = <<<END
name = 'Tim O\'Reilly';
END;$pattern = <<< END
'
(.*?
(?<! \\\\))'
END;preg_match ("($pattern)x",$input,$match);echo $match[1];?>这是一个例子,小弟无法理解工作原理!大侠,救命!谢谢!

解决方案 »

  1.   

    改下格式,看得不爽..$input = "name = 'Tim O\'Reilly'";
    preg_match("/'(.*?(?<![\\\\]))'/",$input,$match);
    echo $match[1];
    首先这个正则要匹配的就是$input字符串,单引号之间的内容,也就是Tim O\'Reilly.
    你会下意识的写上正则/'(.*?)'/,仔细一看字符串,不对,里面还有个单引号,就在转义字符\后面那个.
    于是/'(.*?)'/ 只匹配到了"Tim O\"这几个字符,但是我就是想要Tim O\'Reilly,怎么办呢,聪明的你一定
    想到了,我只要判断单引号前面是否跟着个转义字符\就成了,如果前面是\,就继续匹配,如果不是就匹配结束.
    于是乎就是有了这个东西/(?<![\\\\])'/,匹配前面没有跟着\的那个单引号.
    /'.*?(?<![\\\\])'/的意思就是从第一个引号开始匹配,到前面不跟\号的的那个单引号结束.
    于是就可以匹配到Tim O\'Reilly了.