找回密码
 加入怎通
查看: 1655|回复: 7

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

[复制链接]
杨莹莹连 发表于 2013-11-08 20:20:58 | 显示全部楼层 |阅读模式
  很久没有遇上PHP难点了,这次正则成绩占了小半工夫,还是老成绩最大回溯、递归制约成绩。进修透以后实在并没有难修正调剂有这类成绩的正则。次要是以次多少点。
1 |. `* C' Y" C/ {. w( @
* l$ c' X# d6 Q, @6 F  基于正则抒发式交换的沙盘引擎很简单遇上正则抒发式最大回溯/递归的制约。& b/ H( {  D* b: q" {% X4 T
! v4 z  l' m3 H/ |  N$ I8 Q
  惰性婚配并没有可怜,畸形状况下沙盘并没有会没有够用,常常没有会超过制约,discuz的沙盘引擎就少量运用了。然而因而而没有离开意、没有去进修,则简单书写谬误并遇上成绩。/ e6 b- _  S4 B* w" W# c
4 J; t6 A' w9 v% a
  当preg_*前往的是null的时分则要留意了,判别因变量是is_null.4 [* Z+ F4 X% w. I
  [, ?& p; q: R9 t  D* ^  l3 P
  出错并没有可怜,然而最好把谬误都完好的输入,那样调剂就很简单了。  Q* Q2 u( w5 {6 h& A: G
2 m' Y+ d; U" H# [
  除非输入出错缘由,还要输入婚配的文本和运用的正则,那样就很简单调剂了。7 T- l, K1 ]1 r( ^
8 ^4 T! }8 K6 o2 V0 I
  PHP代码8 s& Y& s2 E5 F
" D% T  ^, Q2 {$ M* O
  if(is_null($tmp)){ + ~% s; m& T. H1 N0 c
! ^. y6 P4 u' P9 T% z" \
  $error_code=preg_last_error(); / I! w* y: m5 ]$ H0 z* c, E

7 r9 g: ^, O4 H  switch($error_code){
* G3 n& j  ^) o$ T* f* s+ x/ F
  casePREG_NO_ERROR:
4 y( S+ P: ?: z8 b& ^7 N8 t* f' ]3 |% S0 v' E8 G* ]) M& X
  echo\'PREG_NO_ERROR\'; % {1 ^; p  T3 h! \3 ~4 b/ ?5 K
( a+ H3 B# q9 n* D8 f% I4 P5 J
  break; $ C; |6 |! P+ F9 U
9 f' J3 W0 h; T+ S3 {, \2 f
  casePREG_INTERNAL_ERROR:
$ x2 t$ H' D  K" O* H6 g" U6 T! B5 Q( O# R. h7 ~! L
  echo\'PREG_INTERNAL_ERROR\'; - A- R; E9 ?; z$ ?$ \

3 G6 N; _$ E: f2 c  break; & ~8 B) L+ I1 M1 |

# Q; T' ~7 b$ @  O7 O# Z  casePREG_BACKTRACK_LIMIT_ERROR:
' q5 i) r) Y4 s6 ?
* ?$ {8 d2 c$ O+ f- M  echo\'PREG_BACKTRACK_LIMIT_ERROR\'; , H% P* O0 E" _1 E" F! J9 p3 c! Z
7 y% w: A" i4 J3 k# ~
  break;
7 X9 U, n2 j3 r' u8 t
% g0 `" {1 H7 O  casePREG_RECURSION_LIMIT_ERROR: ( m, P* Y$ i5 E  n: I: g

' O6 \! ^9 S* l+ s. k6 L  A( i0 f- P  echo\'PREG_RECURSION_LIMIT_ERROR\';
4 }* H; |% E7 Y
7 Z- Y% C# {' y- r# P2 y2 ]  break; $ Q7 D- l/ G  e4 }% M, j- J

6 e( e; i" g) Q- s  casePREG_BAD_UTF8_ERROR:
. A! q5 Z, D9 J
; f2 f. e: n5 E7 X: E  echo\'PREG_BAD_UTF8_ERROR\'; 4 Y7 W  ]0 U$ N$ q7 c/ m9 u, Y
) w4 F) S" ~2 n% c8 k
  break;
% ]/ t" p3 }. d9 p
! f# K5 F3 M* j/ n0 ?  casePREG_BAD_UTF8_OFFSET_ERROR:   d# h2 ^2 h: z1 z: s% u

( \3 ~! M! g+ H3 c5 c  echo\'PREG_BAD_UTF8_OFFSET_ERROR\'; * i% C; M: X9 r
% ^( }; ~- m3 K# n4 M
  break;
: e, W" P' `. Y' W" q
6 x, v/ ~8 r# t  \/ U& P9 k) a& B  default: ( Q, v% w& f/ s7 s+ O! v' v
: G, d) l' e0 d: B1 c" v$ b
  echo\'UNKNOWERROR\';
* S' p1 ]) M: b: {& I: e
0 v, A' F3 L$ j: C: Z   , w6 x5 I. F+ T0 u/ D6 M  ?2 [7 E8 Z( p5 X

$ c; J. @" W- b& w  exit;   u; U, a) a! w) C: E5 p
& ?/ o: o- K( n, r6 _
  }, r$ r0 a: r- @9 z- A* C* }' k
8 n  Y2 d  r  n% ~1 |1 @6 Z; E
  参考材料
% r" L8 l% C/ J
" X! S, n+ C" N* N( h, _% Y' u  1、2010, Laruence 《深悉正则(pcre)最大回溯/递归制约》
! F+ Y/ e7 X! \$ ~3 r
4 f( h, ^6 \2 P/ K/ M6 b  2、2011, PHP中文画册 preg_last_error
: q  \- S$ S* q7 j/ _
* z7 Z- @7 E+ P0 f+ K: k! z' D                  , l9 A& Z6 {3 F& Q0 F
- E7 T$ O- s- }. ^2 A
}

暂时无法加载帖子列表

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

释风 发表于 2026-07-14 05:56:51 | 显示全部楼层
分析得很透彻,很多细节都说到点子上了~
回复

使用道具 举报

yaodongx 发表于 2026-07-14 20:00:01 | 显示全部楼层
楼主辛苦了,整理这么多内容,必须点赞收藏
回复

使用道具 举报

娘王 发表于 2026-07-15 23:07:21 | 显示全部楼层
蹲了这么久,终于看到有价值的讨论,支持一下!
回复

使用道具 举报

lelewei 发表于 2026-07-19 04:07:10 | 显示全部楼层
学习到了,之前一直没注意过这个点,受教了
回复

使用道具 举报

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

    本版积分规则

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

    GMT+8, 2026-9-10 21:16 , Processed in 0.049831 second(s), 26 queries , Gzip On.

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

    Powered by Discuz! X3.5

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