// PCRE: Perl Compatible Regular Expressions ReflectionExtension::export( 'pcre'); // // 几个元字符 // . // 明确的匹配一个字符,除换行字符外 $ // 匹配字符串的结束;除非最后一个是换行(/n),这种情况下,它将只匹配换行字符前面的字符 // '/myhere$/' 可以匹配 "hello myhere" 和 "hello, myhere/n", 但是不匹配 "hello myhere." (?: ...) // 创建一个在输出中不编号的分组, 该分组会与字符串匹配,但是匹配结果不在输出中编号。 // (?: ...) 与 () 的区别是前者只匹配但不编号 preg_match( '/hello (?:myhere)/', "hello myhere, are you ok?", $matches); print_r( $matches); // 注意: preg_match() 第三个参数是作为引用传给 preg_match() 的,preg_match() 匹配完后将结果传给这个参数; // 这个参数为一个数组,索引 0 总是完全匹配的字符串,而所有的自正则表达式都根据他们在正则中出现的顺序分配一个数字索引。 (?P<name> ...) // 创建一个有名字的分组。与常规的子正则式一样,但是他会在 $matches 数组中产生附加的元素 preg_match('/(?P<name>[^/d]+)(?P<age>[/d]+)/', 'myhere23', $matches); print_r( $matches); // // 几个转义序列 // /** * 单引号和双引号中的 / 说明: * 如果 / 和后面的字符能组成一个转移序列,这他们组成一个转移序列; * 否则 / 代表 / * * echo '/*'; // 输出: /* * echo "/myhere"; // 输出: /myhere */ '//' 或 "" // 匹配 / // 说明: 引号中 / 能和后面的字符组成一个转移,因此前两个 / 交给 PHP 解析器处理,后两个也交给 PHP 处理; // 处理完后为 //,这时在交给 pcre 处理,pcre 转移为 / /w // 任意属于一个词的部分的字符,之任意字母,数字,或者下划线字符。字母是指当前使用语言的字母。 // setlocale(LC_ALL, 'C') /b // 一个词语分界线的锚点。 $str = '##myhere##'; preg_match( '//b.+/b/', $str, $matches); print_r( $matches); // // 修饰符 // i // 不区分大小写 m // 改变 ^ 和 $ 的匹配方式 // 默认情况下 PCRE 认为 要匹配的 的字符串的是一行的(即使字符串里面含有 /n, // 这时候 pcre 不是认为字符串是多行的),因此 ^ 和 $ 只匹配整个字符串的开始和结束; // // 若加上 m 修饰符,则 pcre 可以识别字符串是多行的,而且 ^ 会匹配 /n 后面; $ 会匹配 /n 前面 s // 默认 . 不匹配 /n 字符,用 s 修饰后 . 可以匹配 /n 字符 x // 设置该修饰符后,正则式中忽略任意个空白,除非空白被转义或者在 [] 中 // -- preg_match( '/hello myhere/x', "hello myhere!", $matches); print_r( $matches); // -- preg_match( '/hello/ myhere/x', "hello myhere!", $matches); print_r( $matches); // -- preg_match( '/hello[ ]myhere/x', "hello myhere!", $matches); print_r( $matches); // -- U // 变换 pcre 引擎的 "贪吃" 的无限性原则 /** * pcre 函数 */ // // 匹配函数 // preg_match() // 2/5 // 返回匹配的个数( 0 或 1) 或者失败返回 FALSE // 该函数找到第一个匹配的就停止 // 若提供第三个参数,这 pcre 处理完后该参数为一个数组: // 数组中索引为 0 元素总是所有匹配的内容,后面元素一次为正则中的自表达式 // Do not use preg_match() if you only want to check if one string is contained in another string. // Use strpos() or strstr() instead as they will be faster. preg_match_all() // 3/5 // After the first match is found, the subsequent searches are continued on from end of the last match. // 第一个模式找到后会接着在后面的字符串中匹配。 preg_grep() // 2/3 // Return array entries that match the pattern // Returns the array consisting of the elements of the input array that match the given pattern . // // 替换函数 // preg_replace( $pattern, $replacement, $subject) // 3/5 // 可以使用 e 把 $replacement 作为 PHP 代码一样使用并计算出其值 // The e modifier makes preg_replace() treat the replacement parameter as PHP code // after the appropriate references substitution is done. // // Tip: make sure that replacement constitutes a valid PHP code string, // otherwise PHP will complain about a parse error at the line containing preg_replace(). $name = preg_replace( '/([^/d]+) ([/d]+)/e', '"name:" . strtoupper( $1) .";age:" . $2', 'myhere 23'); // 可以使用向后引用: //n 或 $n // 在 $replacement 中要使用 / 的话必须是 "" (向后引用 //n) // 为避免 $11 的不清楚,使用 ${1}1 来代替( $11 指第 11 个或第 1 个,然后连接 1) preg_replace_callback() // 3/5 // 不需要指定 e,也不能指定 e $name = preg_replace_callback( '/([^/d+]) ([^d+])/', create_function( '$matches', 'return "name:" . strtoupper($matches[1]) .";age" . $matches[2];' ), 'myhere 23' ) preg_filter() // 3/5 // Perform a regular expression search and replace // preg_filter() is identical to preg_replace() except it only returns the matches /** * 分割函数 */ preg_split() // Split string by a regular expression // If you don't need the power of regular expressions, // you can choose faster (albeit simpler) alternatives like explode() or str_split(). /** * 其他 pcre 函数 */ preg_last_error() // 0/0 // Returns the error code of the last PCRE regex execution preg_quote() // 1/2 // Quote regular expression characters // preg_quote() takes str and puts a backslash in front of every character // that is part of the regular expression syntax. // // This is useful if you have a run-time string // that you need to match in some text and the string may contain special regex characters. // // The special regular expression characters are: . / + * ? [ ^ ] $ ( ) { } = ! < > | : -