> 백엔드 개발 > PHP 튜토리얼 > 正则表达式 - ThinkPHP 这一段正则是不是写错了?/{|(w+)}/

正则表达式 - ThinkPHP 这一段正则是不是写错了?/{|(w+)}/

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
풀어 주다: 2016-06-06 20:42:05
원래의
1752명이 탐색했습니다.

使用ThinkPHP3.2.2,阅读到一文件中有一行这样的代码:

1

2

3

4

5

<code># 文件 ThinkPHP/Library/Behavior/ReadHtmlCacheBehavior.class.php

# 方法

# {|FUN} 单独使用函数

$rule  = preg_replace_callback('/{|(\w+)}/', function($match){return $match[1]();},$rule);

</code>

로그인 후 복사
로그인 후 복사

1)这个里面 /{|(\w+)}/这一段是不是写错了?
花括号 { },分隔符 | 不是正则的吗?但是却运行正常。

$rule 的值示例:

1

2

3

<code>$rule = '{:module}/{:controller}/{:action}/{$_SERVER.REQUEST_URI|md5}';

 

</code>

로그인 후 복사
로그인 후 복사

2)他的本意是将 $_SERVER.REQUEST_URI 进行MD5后返回。
但是在那一段代码里面并么有 将值传入

1

2

<code>return $match[1]();

</code>

로그인 후 복사
로그인 후 복사

文件完整代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

<code>    // 判断是否需要静态缓存

    static private function requireHtmlCache() {

        // 分析当前的静态规则

         $htmls = C('HTML_CACHE_RULES'); // 读取静态规则

         if(!empty($htmls)) {

            $htmls = array_change_key_case($htmls);

            // 静态规则文件定义格式 actionName=>array('静态规则','缓存时间','附加规则')

            // 'read'=>array('{id},{name}',60,'md5') 必须保证静态规则的唯一性 和 可判断性

            // 检测静态规则

            $controllerName = strtolower(CONTROLLER_NAME);

            $actionName     = strtolower(ACTION_NAME);

            if(isset($htmls[$controllerName.':'.$actionName])) {

                $html   =   $htmls[$controllerName.':'.$actionName];   // 某个控制器的操作的静态规则

            }elseif(isset($htmls[$controllerName.':'])){// 某个控制器的静态规则

                $html   =   $htmls[$controllerName.':'];

            }elseif(isset($htmls[$actionName])){

                $html   =   $htmls[$actionName]; // 所有操作的静态规则

            }elseif(isset($htmls['*'])){

                $html   =   $htmls['*']; // 全局静态规则

            }

            if(!empty($html)) {

                // 解读静态规则

                $rule   = is_array($html)?$html[0]:$html;

                // 以$_开头的系统变量

                $callback = function($match){

                    switch($match[1]){

                        case '_GET':        $var = $_GET[$match[2]]; break;

                        case '_POST':       $var = $_POST[$match[2]]; break;

                        case '_REQUEST':    $var = $_REQUEST[$match[2]]; break;

                        case '_SERVER':     $var = $_SERVER[$match[2]]; break;

                        case '_SESSION':    $var = $_SESSION[$match[2]]; break;

                        case '_COOKIE':     $var = $_COOKIE[$match[2]]; break;

                    }

                    return (count($match) == 4) ? $match[3]($var) : $var;

                };

                $rule     = preg_replace_callback('/{\$(_\w+)\.(\w+)(?:\|(\w+))?}/', $callback, $rule);

                // {ID|FUN} GET变量的简写

                $rule     = preg_replace_callback('/{(\w+)\|(\w+)}/', function($match){return $match[2]($_GET[$match[1]]);}, $rule);

                $rule     = preg_replace_callback('/{(\w+)}/', function($match){return $_GET[$match[1]];}, $rule);

                // 特殊系统变量

                $rule   = str_ireplace(

                    array('{:controller}','{:action}','{:module}'),

                    array(CONTROLLER_NAME,ACTION_NAME,MODULE_NAME),

                    $rule);

                // {|FUN} 单独使用函数

                $rule  = preg_replace_callback('/{|(\w+)}/', function($match){return $match[1]();},$rule);

                $cacheTime  =   C('HTML_CACHE_TIME',null,60);

                if(is_array($html)){

                    if(!empty($html[2])) $rule    =   $html[2]($rule); // 应用附加函数

                    $cacheTime  =   isset($html[1])?$html[1]:$cacheTime; // 缓存有效期

                }else{

                    $cacheTime  =   $cacheTime;

                }

 

                // 当前缓存文件

                define('HTML_FILE_NAME',HTML_PATH . $rule.C('HTML_FILE_SUFFIX',null,'.html'));

                return $cacheTime;

            }

        }

        // 无需缓存

        return false;

    }

 

</code>

로그인 후 복사
로그인 후 복사

回复内容:

使用ThinkPHP3.2.2,阅读到一文件中有一行这样的代码:

1

2

3

4

5

<code># 文件 ThinkPHP/Library/Behavior/ReadHtmlCacheBehavior.class.php

# 方法

# {|FUN} 单独使用函数

$rule  = preg_replace_callback('/{|(\w+)}/', function($match){return $match[1]();},$rule);

</code>

로그인 후 복사
로그인 후 복사

1)这个里面 /{|(\w+)}/这一段是不是写错了?
花括号 { },分隔符 | 不是正则的吗?但是却运行正常。

$rule 的值示例:

1

2

3

<code>$rule = '{:module}/{:controller}/{:action}/{$_SERVER.REQUEST_URI|md5}';

 

</code>

로그인 후 복사
로그인 후 복사

2)他的本意是将 $_SERVER.REQUEST_URI 进行MD5后返回。
但是在那一段代码里面并么有 将值传入

1

2

<code>return $match[1]();

</code>

로그인 후 복사
로그인 후 복사

文件完整代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

<code>    // 判断是否需要静态缓存

    static private function requireHtmlCache() {

        // 分析当前的静态规则

         $htmls = C('HTML_CACHE_RULES'); // 读取静态规则

         if(!empty($htmls)) {

            $htmls = array_change_key_case($htmls);

            // 静态规则文件定义格式 actionName=>array('静态规则','缓存时间','附加规则')

            // 'read'=>array('{id},{name}',60,'md5') 必须保证静态规则的唯一性 和 可判断性

            // 检测静态规则

            $controllerName = strtolower(CONTROLLER_NAME);

            $actionName     = strtolower(ACTION_NAME);

            if(isset($htmls[$controllerName.':'.$actionName])) {

                $html   =   $htmls[$controllerName.':'.$actionName];   // 某个控制器的操作的静态规则

            }elseif(isset($htmls[$controllerName.':'])){// 某个控制器的静态规则

                $html   =   $htmls[$controllerName.':'];

            }elseif(isset($htmls[$actionName])){

                $html   =   $htmls[$actionName]; // 所有操作的静态规则

            }elseif(isset($htmls['*'])){

                $html   =   $htmls['*']; // 全局静态规则

            }

            if(!empty($html)) {

                // 解读静态规则

                $rule   = is_array($html)?$html[0]:$html;

                // 以$_开头的系统变量

                $callback = function($match){

                    switch($match[1]){

                        case '_GET':        $var = $_GET[$match[2]]; break;

                        case '_POST':       $var = $_POST[$match[2]]; break;

                        case '_REQUEST':    $var = $_REQUEST[$match[2]]; break;

                        case '_SERVER':     $var = $_SERVER[$match[2]]; break;

                        case '_SESSION':    $var = $_SESSION[$match[2]]; break;

                        case '_COOKIE':     $var = $_COOKIE[$match[2]]; break;

                    }

                    return (count($match) == 4) ? $match[3]($var) : $var;

                };

                $rule     = preg_replace_callback('/{\$(_\w+)\.(\w+)(?:\|(\w+))?}/', $callback, $rule);

                // {ID|FUN} GET变量的简写

                $rule     = preg_replace_callback('/{(\w+)\|(\w+)}/', function($match){return $match[2]($_GET[$match[1]]);}, $rule);

                $rule     = preg_replace_callback('/{(\w+)}/', function($match){return $_GET[$match[1]];}, $rule);

                // 特殊系统变量

                $rule   = str_ireplace(

                    array('{:controller}','{:action}','{:module}'),

                    array(CONTROLLER_NAME,ACTION_NAME,MODULE_NAME),

                    $rule);

                // {|FUN} 单独使用函数

                $rule  = preg_replace_callback('/{|(\w+)}/', function($match){return $match[1]();},$rule);

                $cacheTime  =   C('HTML_CACHE_TIME',null,60);

                if(is_array($html)){

                    if(!empty($html[2])) $rule    =   $html[2]($rule); // 应用附加函数

                    $cacheTime  =   isset($html[1])?$html[1]:$cacheTime; // 缓存有效期

                }else{

                    $cacheTime  =   $cacheTime;

                }

 

                // 当前缓存文件

                define('HTML_FILE_NAME',HTML_PATH . $rule.C('HTML_FILE_SUFFIX',null,'.html'));

                return $cacheTime;

            }

        }

        // 无需缓存

        return false;

    }

 

</code>

로그인 후 복사
로그인 후 복사
관련 라벨:
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿