找回密码
 加入怎通
查看: 1573|回复: 3

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

[复制链接]
杨莹莹连 发表于 2013-11-08 20:20:58 | 显示全部楼层 |阅读模式
  很久没有遇上PHP难点了,这次正则成绩占了小半工夫,还是老成绩最大回溯、递归制约成绩。进修透以后实在并没有难修正调剂有这类成绩的正则。次要是以次多少点。$ K: |1 l% S0 q( H$ \4 P4 [7 l; N
" ?1 C/ F$ k) T1 P5 N* r
  基于正则抒发式交换的沙盘引擎很简单遇上正则抒发式最大回溯/递归的制约。1 D, p7 z5 D  x

7 q  g" b. M/ y+ F  U  惰性婚配并没有可怜,畸形状况下沙盘并没有会没有够用,常常没有会超过制约,discuz的沙盘引擎就少量运用了。然而因而而没有离开意、没有去进修,则简单书写谬误并遇上成绩。9 N9 m: q- g& k1 j- K9 j2 j$ I

& [' j# B$ h7 R& s9 F  当preg_*前往的是null的时分则要留意了,判别因变量是is_null.
# T) ]- ?5 ]8 d1 A( y& L
& y& L4 w/ Q, R2 ~! ~+ X5 X) o/ @  出错并没有可怜,然而最好把谬误都完好的输入,那样调剂就很简单了。
; P+ B; G. B% Z" S* j5 c- R- P$ p3 _3 h3 Z+ Y6 U
  除非输入出错缘由,还要输入婚配的文本和运用的正则,那样就很简单调剂了。
/ k2 n0 U+ U9 I! l6 u% R/ A9 m) J% [. G# }
  PHP代码: _, s3 y4 j2 y2 y% W# g

2 C. I7 v) T, l1 {  if(is_null($tmp)){
: E3 b% A. ~5 t& T& `/ e. n$ m8 P% d3 U- h$ ]& ?( {# b
  $error_code=preg_last_error();
2 y5 Y: N; j: A& m/ W. s# q
- p9 K8 g* Q: @  switch($error_code){
0 b( d  ]6 |& h  y2 O% W3 A# r8 q* Z: o' P6 `
  casePREG_NO_ERROR:
) H8 @/ [+ s) J- Z9 _! `) j7 b. L& J6 c; p% }! u4 J% J) P! z& Z4 {
  echo\'PREG_NO_ERROR\'; 8 r4 O4 U: ^* W0 \% k

1 ^0 d4 Y: h9 W9 _( Y  break;
$ E2 |4 M4 ^& A8 I+ ~9 R
% x6 r; _% }% j( {: r5 z  casePREG_INTERNAL_ERROR:   m3 F- r" M% C- h3 A2 G4 a+ k  R  l/ }: H
* l( M& Q4 I6 Q* w; I
  echo\'PREG_INTERNAL_ERROR\';
9 [1 k7 |- y) {; `1 L$ [- M& ^( j6 k. P3 L. L( Y
  break;
9 x( Q4 J0 c$ j8 c5 G) {8 k4 o% |$ K- k- }; R
  casePREG_BACKTRACK_LIMIT_ERROR:
2 G% w4 J! @* G. l6 L3 J" T5 [7 ^/ c( J$ {9 z* b# F
  echo\'PREG_BACKTRACK_LIMIT_ERROR\';
8 J$ Y* o( R9 S1 ^# N6 u' W2 j; y4 C% ^/ d9 ]
  break; 4 @) _" \3 r; p

3 P( t2 |* k, w$ t8 K  casePREG_RECURSION_LIMIT_ERROR:
" Z" Q7 h- }8 ~! L  K% x/ p
% u) {3 c: l* q  echo\'PREG_RECURSION_LIMIT_ERROR\';
8 |* S- D+ z, c5 X6 t  W. d8 {0 U/ r- m0 _' z# }
  break;
" X7 S! B$ b, x. K: W0 O8 C$ z- d: J# F
  casePREG_BAD_UTF8_ERROR:
( c4 k. @7 ]$ l2 p
: R* B0 v+ |9 k  echo\'PREG_BAD_UTF8_ERROR\';
2 l+ _' g# L7 A! Q* p' H$ x
6 ?( D' d! m3 @- c, k6 b& R* ^: O  break; . e$ ~# q7 t8 z/ x( N* ]/ F

1 R( E1 K! S' C2 t6 x, u% Q% Q1 P5 @  casePREG_BAD_UTF8_OFFSET_ERROR:
& Q- G3 v- {) n& E6 B
6 k1 O2 G& Z8 t6 G' B/ W  echo\'PREG_BAD_UTF8_OFFSET_ERROR\'; - x6 G; e# Q; m3 m

: j* h: \( z' {0 d  break; , }4 w7 E& X# b. G6 x% b

: s, [1 w: w% t; w- H- G  default: ' [3 K1 X1 t$ ]; R+ t0 Q

6 X6 _+ \; P5 M4 ^  H; @1 t/ E# T  echo\'UNKNOWERROR\';
* i/ e. p2 U0 ?* S" v/ \
' d+ ]5 L. ?7 P+ P  
% c# n3 O& e3 I4 ^! A. S+ T0 a
8 @6 X/ q- Z; v& e; Z$ y: E  exit; 2 l- c( G' r" m- I9 c

$ i) b+ C0 f4 o3 A8 u( _5 l8 D# }  }* b* ?& j& w! [9 y1 I1 `9 y; ]8 U
3 N1 k2 i. D0 G7 j6 S' ]' s% p' V
  参考材料0 n- S, a9 T/ H
- a6 V- T4 K/ O/ D
  1、2010, Laruence 《深悉正则(pcre)最大回溯/递归制约》/ V. \4 \/ R9 ^1 ^, Y- M

9 K0 @0 V7 Y) C$ E# F4 F! O  2、2011, PHP中文画册 preg_last_error+ ~! t* ]6 }9 f4 r8 P0 c
; X' l# K* h' s' [. E4 ^7 S! C  v
                  ( ?* f6 w2 O( Z7 x9 W
% _3 o9 W8 T6 ?- b- x
}
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

嘿嘿 发表于 2026-03-30 00:15:00 | 显示全部楼层
楼主太厉害了,整理得这么详细,必须支持
回复 支持 反对

使用道具 举报

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

    本版积分规则

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

    GMT+8, 2026-6-12 11:09 , Processed in 0.045582 second(s), 24 queries , Gzip On.

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

    Powered by Discuz! X3.5

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