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

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

[复制链接]
杨莹莹连 发表于 2013-11-08 20:20:58 | 显示全部楼层 |阅读模式
  很久没有遇上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}

暂时无法加载帖子列表

回复

使用道具 举报

店小二 发表于 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-7-27 12:37 , Processed in 0.035470 second(s), 26 queries , Gzip On.

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

    Powered by Discuz! X3.5

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