DiscuzX/upload/source/function/function_preg.php

125 lines
3.4 KiB
PHP

<?php
if(!defined('IN_DISCUZ') || (PHP_VERSION < '7.0.0')) {
exit('Access Denied');
}
eval('
function dpreg_replace_impl($pattern, $replacement, $subject, $limit, &$count) {
$eval = false;
$delimiter = $pattern[0];
if(($position_of_modifier = (int) strrpos($pattern, $delimiter)) > 0) {
if(($position_of_eval = strpos($pattern, \'e\', $position_of_modifier)) !== false) {
$eval = true;
$pattern = substr($pattern, 0, $position_of_eval).substr($pattern, $position_of_eval + 1);
}
}
if($eval) {
return preg_replace_callback($pattern, function($matches) use ($replacement) {
$result = \'\';
$instance = false;
for($i = 0, $j = strlen($replacement); $i < $j; $i ++) {
if(($replacement[$i] == \'$\') || ($replacement[$i] == \'\\\\\')) {
if((($i == 0) || ($replacement[$i - 1] != \'\\\\\')) && isset($replacement[$i + 1])) {
$get_backref_string = substr($replacement, $i + 1);
if($get_backref_string[0] == \'{\') {
$get_backref_result = preg_match(\'/^\\{([0-9]{1,2})\}/\', $get_backref_string, $get_backref_match);
} else {
$get_backref_result = preg_match(\'/^([0-9]{1,2})/\', $get_backref_string, $get_backref_match);
}
if($get_backref_result) {
$backref = $get_backref_match[1];
if(isset($matches[$backref])) {
$result .= addslashes($matches[$backref]);
}
$i += strlen($get_backref_match[0]);
continue;
} else {
if(preg_match(\'/^this([^a-z0-9_]+)/i\', $get_backref_string)) {
$result .= \'$_\';
$instance = true;
continue;
}
}
}
}
$result .= $replacement[$i];
}
if($instance) {
$_this = null;
@$stack = (array) debug_backtrace();
if(isset($stack[6]) && isset($stack[6][\'object\'])) {
if(is_object($stack[6][\'object\'])) {
$_this = $stack[6][\'object\'];
}
}
}
return eval("return {$result};");
}, $subject, $limit, $count);
} else {
return preg_replace($pattern, $replacement, $subject, $limit, $count);
}
}
function dpreg_replace_in_subject($pattern, $replacement, $subject, $limit, &$count) {
if(is_array($pattern)) {
if(is_array($replacement)) {
reset($replacement);
} else {
$replacement_value = $replacement;
}
foreach($pattern as $pattern_value) {
if(is_array($replacement)) {
if(key($replacement) === null) {
$replacement_value = \'\';
} else {
$replacement_value = current($replacement);
next($replacement);
}
}
if(($subject = dpreg_replace_impl($pattern_value, $replacement_value, $subject, $limit, $count)) === null) {
return null;
}
}
return $subject;
} else {
return dpreg_replace_impl($pattern, $replacement, $subject, $limit, $count);
}
}
function _dpreg_replace($pattern, $replacement, $subject, $limit = -1, &$count = null) {
if(is_array($replacement) && !is_array($pattern))
return preg_replace($pattern, $replacement, $subject, $limit, $count);
if(is_array($subject)) {
$result = array();
foreach($subject as $subject_key => $subject_value) {
$result[$subject_key] = dpreg_replace_in_subject($pattern, $replacement, $subject_value, $limit, $count);
}
return $result;
} else {
return dpreg_replace_in_subject($pattern, $replacement, $subject, $limit, $count);
}
}
');