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

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

[复制链接]
杨莹莹连 发表于 2013-11-08 20:20:58 | 显示全部楼层 |阅读模式
  很久没有遇上PHP难点了,这次正则成绩占了小半工夫,还是老成绩最大回溯、递归制约成绩。进修透以后实在并没有难修正调剂有这类成绩的正则。次要是以次多少点。. L' H/ ~2 X: }; ~$ l& j5 H3 i/ v

" h; j& s. S  @  基于正则抒发式交换的沙盘引擎很简单遇上正则抒发式最大回溯/递归的制约。' l0 P/ s- P$ L9 O
) }& t! h. `- G8 p; s9 P
  惰性婚配并没有可怜,畸形状况下沙盘并没有会没有够用,常常没有会超过制约,discuz的沙盘引擎就少量运用了。然而因而而没有离开意、没有去进修,则简单书写谬误并遇上成绩。
$ x3 B6 v8 ]( r: I/ e) i5 |& G% L3 ?% i' O
  当preg_*前往的是null的时分则要留意了,判别因变量是is_null.; I4 h* a# ]; M
1 _" O" m9 X0 r, Q: `# j, G2 z
  出错并没有可怜,然而最好把谬误都完好的输入,那样调剂就很简单了。
3 E9 a8 d  G0 E# h3 T7 U5 Q/ h( |8 B- v: b
  除非输入出错缘由,还要输入婚配的文本和运用的正则,那样就很简单调剂了。5 ?" V+ X! ^" _; k' L2 G

2 ^8 }: |  t% J8 C# V9 w  PHP代码7 h) D, P6 b9 o* r5 P" e

4 k3 h' g* j- m$ L9 ~, A& I0 o% u  if(is_null($tmp)){ 7 t1 F( l" [4 B
8 F0 s/ J+ t2 X1 _
  $error_code=preg_last_error(); : V6 L, `! l  ?
) E: Q; j8 e, t( j
  switch($error_code){ 1 Q% x- @& c& r" w8 U

6 ]1 e2 Z; E. c& v' T  casePREG_NO_ERROR:
/ _, B5 r5 N8 Y+ s/ W( Y! g" r
6 C: F5 m1 x( B/ t) ?& @: T" G4 B  echo\'PREG_NO_ERROR\'; 2 y8 F" I8 d+ \! {+ q. Y

8 r6 F! w; \( D7 n7 o% k( i& b. p  break; 9 ?: v* A* z' h/ L1 b, O3 M8 K) L

- p8 [, N" y7 G* h  casePREG_INTERNAL_ERROR: 4 B7 T9 D, u" A9 B, f) v
, n6 J, q! V, W( h! X
  echo\'PREG_INTERNAL_ERROR\';
$ W2 k9 b6 W5 A: m' S
; A- Q/ q$ e& u$ u0 R  break;
; K5 b) |; Y9 K, U3 }! G/ b5 F: @6 ?" p0 C
  casePREG_BACKTRACK_LIMIT_ERROR:
: s$ ^& ~* i+ I! W6 r/ x$ Y( W+ c% m2 ]0 i! c
  echo\'PREG_BACKTRACK_LIMIT_ERROR\';
5 Y/ d: k3 n. x$ t/ W) S
/ U' s7 h; q3 f  q1 D+ _  break; 2 [" x6 l+ o" I3 y

" w/ d# l$ w4 N# a( K! ]/ ?  casePREG_RECURSION_LIMIT_ERROR: , V. G/ N) i" v' S  \& c; U/ M' X: |

1 j; p7 c* P) y* E3 N  echo\'PREG_RECURSION_LIMIT_ERROR\'; 7 o+ z, H$ [2 X4 Y& t* k

' g$ L! J- i, {6 z4 W! Y5 y  break;
7 q; Z; z, \) b7 U( V! e! r
- o" z$ t1 q, t  _$ y% z/ z  casePREG_BAD_UTF8_ERROR:
& U) j  w; F9 y- {7 ]
# x3 o) v0 O1 j0 Z  echo\'PREG_BAD_UTF8_ERROR\';
& _% o! o4 ~& q7 h
# Q* ~- v( @( g* c/ I$ z* m  break;
4 E8 f- s4 q1 @0 v% i! N5 _1 B) ^/ S1 u. C5 h( p* @
  casePREG_BAD_UTF8_OFFSET_ERROR: & Z& G! P8 B& p4 W/ B$ }! M$ X
7 R: m7 L- Y( @( H+ y
  echo\'PREG_BAD_UTF8_OFFSET_ERROR\'; # W- B! t$ X0 E) m

  \# {# h  G1 p  break; 3 b5 k8 u9 }& ]! q' J, v8 j
" f+ N0 O; L% I( \
  default:
7 c- x% X' s) ?
. ]2 u3 j% R4 x* O; K5 S+ Y  echo\'UNKNOWERROR\';
  k: {' j5 o8 L& q+ v( K  a$ L3 R, x7 s) |9 g3 W. P% L
   + B/ c. T- C6 d- k. K

& b- d; W# u7 a) R4 C7 v& N, l  exit;
$ s. D4 u' D. x- U3 F( k
5 H/ z0 B3 r5 g0 y) ?* y# U  }
. C  h: ?# b' T# ~: i: P# U3 C5 F2 `, |( N0 ?; X
  参考材料
+ D2 _7 r) k4 b* _; f( G6 M
, Q8 _" n# p% z  {, T; Q+ u* T  1、2010, Laruence 《深悉正则(pcre)最大回溯/递归制约》9 C4 P6 m, x+ v9 Y) f

5 h; N1 G$ P% g/ b/ Z$ S4 X  2、2011, PHP中文画册 preg_last_error
6 \0 F6 M8 v7 P! p1 V' q/ x1 Q/ e! D7 U$ t2 p
                 
0 n& T# I; g& I: M, Q. r& L' N# n# y% E
}
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

    本版积分规则

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

    GMT+8, 2026-3-13 15:40 , Processed in 0.317481 second(s), 24 queries , Gzip On.

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

    Powered by Discuz! X3.5

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