很久没有遇上PHP难点了,这次正则成绩占了小半工夫,还是老成绩最大回溯、递归制约成绩。进修透以后实在并没有难修正调剂有这类成绩的正则。次要是以次多少点。. E. o. v% t0 E, C% A" ^7 A
y3 l9 W9 |' W8 }, Y. U, d0 X+ A
基于正则抒发式交换的沙盘引擎很简单遇上正则抒发式最大回溯/递归的制约。4 t+ f* H2 C5 m& U4 y. F# n) x
* M2 Z; J% p U 惰性婚配并没有可怜,畸形状况下沙盘并没有会没有够用,常常没有会超过制约,discuz的沙盘引擎就少量运用了。然而因而而没有离开意、没有去进修,则简单书写谬误并遇上成绩。
- y5 V: D" Z5 G" H' q% x7 o. I0 i/ O$ g9 w
当preg_*前往的是null的时分则要留意了,判别因变量是is_null.
. o8 `: d: a0 i# @# s# t( X5 R
4 b3 X' B) o, b 出错并没有可怜,然而最好把谬误都完好的输入,那样调剂就很简单了。! y" J" s: c% f) G7 P& \$ j8 w
$ }$ D& q2 z# }% J1 A. Y
除非输入出错缘由,还要输入婚配的文本和运用的正则,那样就很简单调剂了。
+ K& {4 z7 Y5 E! N
. r7 q8 K! o" B/ b7 J PHP代码
) X3 Z! A0 w; L- L# p' W
$ {5 g4 V% Z; o# q6 O3 X( C if(is_null($tmp)){ 2 l+ n- X0 b! F& ]# J
. m K& w5 T/ t3 s $error_code=preg_last_error();
. i7 V: i; K9 N$ Y+ [) n* ~( ?" H, I+ y: j0 K2 T4 V
switch($error_code){
% M: b8 z1 U8 g8 W5 a# Y) C! `! @% A% \( q9 C" D4 `; y9 o/ ` Z) z
casePREG_NO_ERROR: 2 l; `3 C: p( U5 E! I7 Q# ^
( T3 ~; i4 Y0 Z" E t0 v echo\'PREG_NO_ERROR\';
8 B/ b4 W. ]- H/ E3 A7 o1 ?" Q h$ L/ e3 f; [7 i
break;
/ Z1 W) y7 q0 X* g+ O8 G' v# R. p; i* t' |" S2 H/ o" |
casePREG_INTERNAL_ERROR:
# F! L5 Y- h6 g5 b* I% o( j9 R
4 Q N [- p8 `4 b8 L7 _5 M echo\'PREG_INTERNAL_ERROR\'; " l/ L4 U5 W5 x8 y7 J
( P* N, r0 |! X break;
" }3 Y. x( L7 D; o( A* K5 i/ V- I. O- I+ }& W1 o
casePREG_BACKTRACK_LIMIT_ERROR: 1 G; ]! j% n8 n/ P$ q$ Z8 |
3 l4 l2 v8 ~+ V3 w echo\'PREG_BACKTRACK_LIMIT_ERROR\'; ; s( N L- \0 e/ J
) ?) D P# A2 r+ Z, j4 ] break;
% A4 p3 w' n7 S9 j' Y3 q# u" a: N" P- [8 F, D
casePREG_RECURSION_LIMIT_ERROR: 2 O' @0 h0 P W' E# `
9 u2 {, X" \: \& {* K/ W4 x1 z) Q echo\'PREG_RECURSION_LIMIT_ERROR\'; ) Q0 A# I; E# U5 D3 q' ~( B; F0 Y
" A4 c5 p% ~- ^6 Z2 D- N- C
break;
( f b* A' c+ v" l$ F3 b3 d' X/ V& _* i- _$ _3 h6 q/ }9 B
casePREG_BAD_UTF8_ERROR:
9 B$ }8 r5 J5 S
7 k- y2 R6 S% B0 r; F" r |5 Z echo\'PREG_BAD_UTF8_ERROR\';
/ t( u# Q' Y2 @' e3 f9 }' \2 b! @/ y
break;
/ W" }! T4 U6 j7 K' P8 h* k$ X$ W) |0 l4 T1 {2 o9 o; z7 {) B
casePREG_BAD_UTF8_OFFSET_ERROR: ) p+ ]* o) n) G! L( l
5 k% @8 B4 ?! ]/ c$ a echo\'PREG_BAD_UTF8_OFFSET_ERROR\'; # w; q3 u5 g" b
) F3 u8 L& W& Q; A" @
break; - ^) R+ e H; y
2 e1 v0 i S+ ?) F( J+ I default:
7 u+ E$ Z k* k8 g% s* E
3 {1 c. M8 q7 k2 g) _' c( Y. k echo\'UNKNOWERROR\'; + W/ L3 _! H' C0 K5 m, ?8 y
5 x' u1 R& q2 f8 \+ u 7 m/ O9 }) R' J3 |, g# _2 W4 ]( r
8 e7 P+ R- x1 D" G exit; + f3 k. z" d2 w5 l; y' z
/ B5 c1 Q$ l. P: s! @- o
}
/ {' G& t/ p/ [% S+ `0 f. ^" ~
, q/ O) X7 b8 v. [ 参考材料- J s( V3 B- p( I E- E0 @
6 ?9 c' R: u L: t; ?: s2 S 1、2010, Laruence 《深悉正则(pcre)最大回溯/递归制约》# r0 H" @( ~( ]( n* H: R
" l5 E1 _2 i0 ^. [3 v2 { 2、2011, PHP中文画册 preg_last_error
: e, v5 g' Q2 n" q* \ F) s# L: f8 m# u3 I, X$ N9 _2 D5 W- } I
8 P% K. W: w. y7 l. x
$ m9 S; O, W% g} |