找回密码
 加入怎通
查看: 1556|回复: 2

[其他] 沙盘引擎正则抒发式调剂小技巧

[复制链接]
杨莹莹连 发表于 2013-11-08 20:20:58 | 显示全部楼层 |阅读模式
  很久没有遇上PHP难点了,这次正则成绩占了小半工夫,还是老成绩最大回溯、递归制约成绩。进修透以后实在并没有难修正调剂有这类成绩的正则。次要是以次多少点。' I. v4 s  @: s! U7 H4 V& |* p

% K* \% c. C, O  基于正则抒发式交换的沙盘引擎很简单遇上正则抒发式最大回溯/递归的制约。1 [( n0 y! i6 e% a+ `

, W- ]/ y# Y% n; O' a! d. O$ x7 O' V  惰性婚配并没有可怜,畸形状况下沙盘并没有会没有够用,常常没有会超过制约,discuz的沙盘引擎就少量运用了。然而因而而没有离开意、没有去进修,则简单书写谬误并遇上成绩。
% k  ^5 C5 t% f  }
, }. p9 R2 q% [: A5 x4 x  当preg_*前往的是null的时分则要留意了,判别因变量是is_null.
5 r7 _+ {5 U& l) |$ g' I; [8 I) q. K
9 \# [! ]3 [0 r. f0 X9 A1 G  出错并没有可怜,然而最好把谬误都完好的输入,那样调剂就很简单了。) B% Z5 w) a$ S5 q$ G

: d4 H' s- _4 @4 y0 H" v  除非输入出错缘由,还要输入婚配的文本和运用的正则,那样就很简单调剂了。+ w+ \) z: F# }( F- ]

% J6 n, s# S  l+ c) O  PHP代码
$ b' I) j+ t& c7 |; B8 e: o8 ^) X2 ^7 h4 n+ c0 A
  if(is_null($tmp)){
1 o2 \+ M1 m0 a# A& E# W- l2 D8 S3 f# a4 o( B0 j: g) d9 S; x
  $error_code=preg_last_error();
4 e0 @9 ?/ u( J1 @8 x
8 o& j% t4 M  w  switch($error_code){ - R* d. z! ^9 B1 S2 G( E6 v

) X/ U1 `2 I. D  casePREG_NO_ERROR: ; v  v& D5 a% L% R: k! O' |/ }* y
6 k- s: a  |; ^* L0 d& M  s9 e7 M+ S& H
  echo\'PREG_NO_ERROR\'; 9 h7 I7 @- s  Y" Z7 r, T

4 i7 U& h1 P+ b% ^, Y6 j! G+ Y; V  break;
$ a7 @- C" i$ N; L$ l2 X
" o4 T& i8 q5 ~9 o5 Y  y" u5 X  casePREG_INTERNAL_ERROR:
) z8 K3 X* w2 a( M, s6 h  C1 l: |4 d7 ?/ H1 o4 _
  echo\'PREG_INTERNAL_ERROR\'; ! ^9 d5 [2 \" x, \' A7 Z' X

7 E( d% A" @0 L' w/ t; f1 i3 p% ]! M  break; 5 O3 T2 D; ?. l1 T- `, R
5 v+ m4 Y5 h: k; [, y% R
  casePREG_BACKTRACK_LIMIT_ERROR: 5 u/ x$ t5 D. g6 ]( r
+ ~) R; l5 v1 K2 T3 D
  echo\'PREG_BACKTRACK_LIMIT_ERROR\';   R  v  a( ?2 B  w' ^3 p+ w
* C3 @+ @5 i/ t/ j
  break;
5 [2 R+ Y& T+ N. }' k5 m7 y% ?7 e
  casePREG_RECURSION_LIMIT_ERROR: , B# Q& B5 P7 h/ u( D& {: c9 O& _

! a* z; Q/ W9 n& L" J" k/ }  echo\'PREG_RECURSION_LIMIT_ERROR\'; 2 r! \: h& h# z" F# D5 L. T; b8 T

" I4 A3 U- ?/ U  break;
" u' y" D% B, E2 I; A  a% O8 U; k
  casePREG_BAD_UTF8_ERROR: 0 y) j- N9 O8 c7 [) k

3 O* T/ ~( U8 p9 S) m7 w! L9 `, v  echo\'PREG_BAD_UTF8_ERROR\';
! ], U5 p3 T) e/ c3 u( O) [
# Z$ B  B2 F6 j( k& R7 d, H  break; * L4 E( j7 ?$ {7 Q7 \- z1 u

) n- n1 [4 C- Q! q1 `  casePREG_BAD_UTF8_OFFSET_ERROR: & o% l4 Q0 G+ u8 f& [

) M8 w, }2 s2 r& M( @' S5 s  echo\'PREG_BAD_UTF8_OFFSET_ERROR\';
5 d+ W6 h  L( _5 z  \
1 o# E9 v0 H" j9 c6 \3 e/ l  break;
& ]9 G  i* A9 Q3 n: W' u7 z) i! Y  b' ^: e* a; O0 w
  default:
7 |8 \4 y8 n$ @$ W: D
, W) ~+ D2 G+ w5 j% N* _3 l  echo\'UNKNOWERROR\'; & a9 o- l; [% d1 B' V
2 v: g7 r  J# }" @. m" t: G  x
  
0 J4 y' ^8 ]2 q7 }8 \
# q9 G3 l0 I% ~  exit; $ M# a, `7 j) f0 K1 k1 J  n/ f. f( s: {

3 `) i" L+ n0 J7 g  }; d. i2 R! Q( C4 d* T! q& ^3 i) s

. H- J5 E# w# I5 e, {% _9 S6 m5 i! v  参考材料8 a1 h1 G, t4 R- U# q2 `

" S2 }7 X& Q) U9 N, c5 u4 C  1、2010, Laruence 《深悉正则(pcre)最大回溯/递归制约》
$ R+ r( B+ E( k; [
& S0 [& U  y8 l( w5 b  2、2011, PHP中文画册 preg_last_error
( v7 N; z4 c% J1 F8 {, g, H" w2 f& R! u. V: W1 Q, T# k
                  9 w: I  p9 M& g0 C' K
) _) Z* V1 U4 b$ h; @
}
回复

使用道具 举报

店小二 发表于 2026-02-05 05:09:43 | 显示全部楼层
这个分享太实用了,刚好能用到,感谢楼主!
回复 支持 反对

使用道具 举报

forex001 发表于 2026-02-27 10:29:22 | 显示全部楼层
这个思路很新颖,打开了新世界的大门,谢谢分享
回复 支持 反对

使用道具 举报

2026年3月23日真牛社区(fd.znbgj.com)签到记录贴
我今天最想说:「www.hzzdsw.com 加油」.

    您需要登录后才可以回帖 登录 | 加入怎通

    本版积分规则

    QQ|手机版|小黑屋|网站地图|真牛社区 ( 苏ICP备2023040716号-2 )

    GMT+8, 2026-3-24 11:34 , Processed in 0.062274 second(s), 24 queries , Gzip On.

    免责声明:本站信息来自互联网,本站不对其内容真实性负责,如有侵权等情况请联系420897364#qq.com(把#换成@)删除。

    Powered by Discuz! X3.5

    快速回复 返回顶部 返回列表