function_preg.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <?php
  2. if(!defined('IN_DISCUZ') || (PHP_VERSION < '7.0.0')) {
  3. exit('Access Denied');
  4. }
  5. eval('
  6. function dpreg_replace_impl($pattern, $replacement, $subject, $limit, &$count) {
  7. $eval = false;
  8. $delimiter = $pattern[0];
  9. if(($position_of_modifier = (int) strrpos($pattern, $delimiter)) > 0) {
  10. if(($position_of_eval = strpos($pattern, \'e\', $position_of_modifier)) !== false) {
  11. $eval = true;
  12. $pattern = substr($pattern, 0, $position_of_eval).substr($pattern, $position_of_eval + 1);
  13. }
  14. }
  15. if($eval) {
  16. return preg_replace_callback($pattern, function($matches) use ($replacement) {
  17. $result = \'\';
  18. $instance = false;
  19. for($i = 0, $j = strlen($replacement); $i < $j; $i ++) {
  20. if(($replacement[$i] == \'$\') || ($replacement[$i] == \'\\\\\')) {
  21. if((($i == 0) || ($replacement[$i - 1] != \'\\\\\')) && isset($replacement[$i + 1])) {
  22. $get_backref_string = substr($replacement, $i + 1);
  23. if($get_backref_string[0] == \'{\') {
  24. $get_backref_result = preg_match(\'/^\\{([0-9]{1,2})\}/\', $get_backref_string, $get_backref_match);
  25. } else {
  26. $get_backref_result = preg_match(\'/^([0-9]{1,2})/\', $get_backref_string, $get_backref_match);
  27. }
  28. if($get_backref_result) {
  29. $backref = $get_backref_match[1];
  30. if(isset($matches[$backref])) {
  31. $result .= addslashes($matches[$backref]);
  32. }
  33. $i += strlen($get_backref_match[0]);
  34. continue;
  35. } else {
  36. if(preg_match(\'/^this([^a-z0-9_]+)/i\', $get_backref_string)) {
  37. $result .= \'$_\';
  38. $instance = true;
  39. continue;
  40. }
  41. }
  42. }
  43. }
  44. $result .= $replacement[$i];
  45. }
  46. if($instance) {
  47. $_this = null;
  48. @$stack = (array) debug_backtrace();
  49. if(isset($stack[6]) && isset($stack[6][\'object\'])) {
  50. if(is_object($stack[6][\'object\'])) {
  51. $_this = $stack[6][\'object\'];
  52. }
  53. }
  54. }
  55. return eval("return {$result};");
  56. }, $subject, $limit, $count);
  57. } else {
  58. return preg_replace($pattern, $replacement, $subject, $limit, $count);
  59. }
  60. }
  61. function dpreg_replace_in_subject($pattern, $replacement, $subject, $limit, &$count) {
  62. if(is_array($pattern)) {
  63. if(is_array($replacement)) {
  64. reset($replacement);
  65. } else {
  66. $replacement_value = $replacement;
  67. }
  68. foreach($pattern as $pattern_value) {
  69. if(is_array($replacement)) {
  70. if(key($replacement) === null) {
  71. $replacement_value = \'\';
  72. } else {
  73. $replacement_value = current($replacement);
  74. next($replacement);
  75. }
  76. }
  77. if(($subject = dpreg_replace_impl($pattern_value, $replacement_value, $subject, $limit, $count)) === null) {
  78. return null;
  79. }
  80. }
  81. return $subject;
  82. } else {
  83. return dpreg_replace_impl($pattern, $replacement, $subject, $limit, $count);
  84. }
  85. }
  86. function _dpreg_replace($pattern, $replacement, $subject, $limit = -1, &$count = null) {
  87. if(is_array($replacement) && !is_array($pattern))
  88. return preg_replace($pattern, $replacement, $subject, $limit, $count);
  89. if(is_array($subject)) {
  90. $result = array();
  91. foreach($subject as $subject_key => $subject_value) {
  92. $result[$subject_key] = dpreg_replace_in_subject($pattern, $replacement, $subject_value, $limit, $count);
  93. }
  94. return $result;
  95. } else {
  96. return dpreg_replace_in_subject($pattern, $replacement, $subject, $limit, $count);
  97. }
  98. }
  99. ');