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

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

[复制链接]
杨莹莹连 发表于 2013-11-08 20:20:58 | 显示全部楼层 |阅读模式
  很久没有遇上PHP难点了,这次正则成绩占了小半工夫,还是老成绩最大回溯、递归制约成绩。进修透以后实在并没有难修正调剂有这类成绩的正则。次要是以次多少点。
7 {7 t0 `5 H+ w4 x" N, f
1 V/ ?) |0 r; ?( P: q# L& P7 [  基于正则抒发式交换的沙盘引擎很简单遇上正则抒发式最大回溯/递归的制约。
5 H  V+ W; j! F  [/ H+ r9 p4 q; U
1 U2 l2 E0 f4 L# f4 W  惰性婚配并没有可怜,畸形状况下沙盘并没有会没有够用,常常没有会超过制约,discuz的沙盘引擎就少量运用了。然而因而而没有离开意、没有去进修,则简单书写谬误并遇上成绩。
0 g' S4 q% v' L7 K# T. j$ I
6 I9 M" z2 _1 L" ^3 R: r9 n9 l  当preg_*前往的是null的时分则要留意了,判别因变量是is_null.1 G+ V( R+ z& g6 Q

& p8 m/ }9 f+ x; j1 u* |  出错并没有可怜,然而最好把谬误都完好的输入,那样调剂就很简单了。
# G% P3 P- }  u& @# b, z2 @
- Z5 p: L1 z4 @$ w* i( k  除非输入出错缘由,还要输入婚配的文本和运用的正则,那样就很简单调剂了。; V% _, o. b) A  s$ s4 K

& R$ y2 W9 `1 n& y& r/ z5 r  PHP代码5 R) T" h2 h2 c0 S1 c8 l

0 i9 I& k% t* d1 ^5 `  if(is_null($tmp)){ 6 L2 k( E" e' E6 K2 I3 q$ F

; o  o! b* l5 g  $error_code=preg_last_error(); * O- m4 W3 R) j# [; C3 c) d
& J" C) j: F! P) j' Q
  switch($error_code){
% I8 A- @. {) g
$ Z9 k- H5 W% q/ }4 ~  casePREG_NO_ERROR: & ]' `6 E  ^& K

9 e) ~& E4 J; W7 v7 W  echo\'PREG_NO_ERROR\'; 2 R7 _9 h- M4 {* \! i7 Q( H
0 Y+ d+ X0 y8 r+ \+ Y: Z
  break;
$ Y5 p7 e/ _1 p/ [7 @& s: }, k/ f6 Q$ {2 F; ^$ ?7 c" e$ m
  casePREG_INTERNAL_ERROR: : I# M9 q, R! `

8 B, X5 i0 U- \8 j* W  echo\'PREG_INTERNAL_ERROR\';
7 k- e9 c0 O9 m; P& @- w
# X, q- I& u3 ~! h  break; ( d+ ?2 `+ m3 y

0 G1 g( C' s) p7 [  casePREG_BACKTRACK_LIMIT_ERROR:
& u* j7 n/ K! H& q: c* @% @1 j$ Y; |/ y5 p  }8 d2 B3 J( C
  echo\'PREG_BACKTRACK_LIMIT_ERROR\';
( O6 C* a8 k: I: ]3 @* R" t8 O  z& _; i* V
  break; ; S' I5 V( x' S, {
3 o2 k; s1 Y/ e0 k" P
  casePREG_RECURSION_LIMIT_ERROR: / m; D' ?9 a% a" o

: u6 N& j# D# W7 C3 D  echo\'PREG_RECURSION_LIMIT_ERROR\'; 9 [, [2 q! ?5 a0 [9 f
  A1 a! J2 Y: F) \
  break; ! {% ?8 h! R, U! ~' L; }7 a# [3 e  M
* j0 b' S7 V# g. j! W( \1 v
  casePREG_BAD_UTF8_ERROR: 6 X% ]" \4 U1 c$ J) }
# ]/ F% k& ]7 f, Y
  echo\'PREG_BAD_UTF8_ERROR\';
) u3 v. `- f2 W+ J2 Z
$ O) W5 J; N0 b1 R2 k3 F  break; 8 ~, I6 o# t2 }
& Y% Q- _* M6 E* M; r- t6 \
  casePREG_BAD_UTF8_OFFSET_ERROR: & C: c9 ]8 {$ e' e

2 P3 h# I8 q% W" k0 {7 Q8 N  echo\'PREG_BAD_UTF8_OFFSET_ERROR\';
- b6 Y6 K3 u! [* F1 v0 U: U5 t' b6 |4 i* g2 _# y/ Q* t
  break; ' Z- R. b2 k7 [; y) O' j  W

, {. o7 K6 q+ ?1 w  default:
0 w- P2 Z4 u% N7 m; z, {: w
& b7 ~( L2 o1 j, n# Z  echo\'UNKNOWERROR\'; $ e8 W$ O/ e+ ~% ]! [
! |5 V" J1 E: Z% @8 G+ d: K" n
   4 O7 F* o( D8 E- U: s
3 F! `1 Z. D) e
  exit;
, u1 K1 Y1 b; z" t' _) G6 b' [. w% m9 v/ Q0 N# q
  }
0 f( ~0 |! S" H5 G' E3 ^
- }# l4 h- x# F$ Q9 K9 V  参考材料
1 V7 y; z( F: s) Z# r5 I8 X/ a- a( d6 u
  1、2010, Laruence 《深悉正则(pcre)最大回溯/递归制约》
1 D/ o5 Z  Q% u; s, v9 r8 i
5 w: |: g9 U5 y  t8 r* b8 L  2、2011, PHP中文画册 preg_last_error
# u% [2 y' \6 S: a2 X  N1 n$ S8 |
9 p* Z# Y0 f. y+ b2 \- `' m- F2 X                 
3 U# [- A; J7 q  ~9 ?5 @
5 N# e2 a$ H( j% y& B: I$ \}
回复

使用道具 举报

店小二 发表于 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-4-28 03:41 , Processed in 0.267103 second(s), 24 queries , Gzip On.

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

    Powered by Discuz! X3.5

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