mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-10 21:38:54 +00:00
Merge pull request #3618 from marc1706/ticket/13832
[ticket/13832] Use preg_replace_callback instead of /e modifier
This commit is contained in:
commit
6bcf12a558
5 changed files with 138 additions and 32 deletions
|
@ -140,8 +140,12 @@ function html_entity_decode_utf8($string)
|
||||||
static $trans_tbl;
|
static $trans_tbl;
|
||||||
|
|
||||||
// replace numeric entities
|
// replace numeric entities
|
||||||
$string = preg_replace('~&#x([0-9a-f]+);~ei', 'code2utf8(hexdec("\\1"))', $string);
|
$string = preg_replace_callback('~&#x([0-9a-f]+);~i', function ($match) {
|
||||||
$string = preg_replace('~&#([0-9]+);~e', 'code2utf8(\\1)', $string);
|
return code2utf8(hexdec($match[1]));
|
||||||
|
}, $string);
|
||||||
|
$string = preg_replace_callback('~&#([0-9]+);~', function ($match) {
|
||||||
|
return code2utf8($match[1]);
|
||||||
|
}, $string);
|
||||||
|
|
||||||
// replace literal entities
|
// replace literal entities
|
||||||
if (!isset($trans_tbl))
|
if (!isset($trans_tbl))
|
||||||
|
|
|
@ -489,7 +489,9 @@ class acp_bbcodes
|
||||||
if (preg_match_all('/(?<!\\\\)\$([0-9]+)/', $replace, $repad))
|
if (preg_match_all('/(?<!\\\\)\$([0-9]+)/', $replace, $repad))
|
||||||
{
|
{
|
||||||
$repad = $pad + sizeof(array_unique($repad[0]));
|
$repad = $pad + sizeof(array_unique($repad[0]));
|
||||||
$replace = preg_replace('/(?<!\\\\)\$([0-9]+)/e', "'\${' . (\$1 + \$pad) . '}'", $replace);
|
$replace = preg_replace_callback('/(?<!\\\\)\$([0-9]+)/', function ($match) use ($pad) {
|
||||||
|
return '${' . ($match[1] + $pad) . '}';
|
||||||
|
}, $replace);
|
||||||
$pad = $repad;
|
$pad = $repad;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -554,10 +556,18 @@ class acp_bbcodes
|
||||||
trigger_error($user->lang['BBCODE_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
|
trigger_error($user->lang['BBCODE_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
|
||||||
}
|
}
|
||||||
|
|
||||||
$fp_match = preg_replace('#\[/?' . $bbcode_search . '#ie', "strtolower('\$0')", $fp_match);
|
$fp_match = preg_replace_callback('#\[/?' . $bbcode_search . '#i', function ($match) {
|
||||||
$fp_replace = preg_replace('#\[/?' . $bbcode_search . '#ie', "strtolower('\$0')", $fp_replace);
|
return strtolower($match[0]);
|
||||||
$sp_match = preg_replace('#\[/?' . $bbcode_search . '#ie', "strtolower('\$0')", $sp_match);
|
}, $fp_match);
|
||||||
$sp_replace = preg_replace('#\[/?' . $bbcode_search . '#ie', "strtolower('\$0')", $sp_replace);
|
$fp_replace = preg_replace_callback('#\[/?' . $bbcode_search . '#i', function ($match) {
|
||||||
|
return strtolower($match[0]);
|
||||||
|
}, $fp_replace);
|
||||||
|
$sp_match = preg_replace_callback('#\[/?' . $bbcode_search . '#i', function ($match) {
|
||||||
|
return strtolower($match[0]);
|
||||||
|
}, $sp_match);
|
||||||
|
$sp_replace = preg_replace_callback('#\[/?' . $bbcode_search . '#i', function ($match) {
|
||||||
|
return strtolower($match[0]);
|
||||||
|
}, $sp_replace);
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
'bbcode_tag' => $bbcode_tag,
|
'bbcode_tag' => $bbcode_tag,
|
||||||
|
|
|
@ -110,7 +110,18 @@ class bbcode
|
||||||
$undid_bbcode_specialchars = true;
|
$undid_bbcode_specialchars = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
$message = preg_replace($preg['search'], $preg['replace'], $message);
|
foreach ($preg['search'] as $key => $search)
|
||||||
|
{
|
||||||
|
if (is_callable($preg['replace'][$key]))
|
||||||
|
{
|
||||||
|
$message = preg_replace_callback($search, $preg['replace'][$key], $message);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$message = preg_replace($search, $preg['replace'][$key], $message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$preg = array('search' => array(), 'replace' => array());
|
$preg = array('search' => array(), 'replace' => array());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -214,7 +225,9 @@ class bbcode
|
||||||
'[/quote:$uid]' => $this->bbcode_tpl('quote_close', $bbcode_id)
|
'[/quote:$uid]' => $this->bbcode_tpl('quote_close', $bbcode_id)
|
||||||
),
|
),
|
||||||
'preg' => array(
|
'preg' => array(
|
||||||
'#\[quote(?:="(.*?)")?:$uid\]((?!\[quote(?:=".*?")?:$uid\]).)?#ise' => "\$this->bbcode_second_pass_quote('\$1', '\$2')"
|
'#\[quote(?:="(.*?)")?:$uid\]((?!\[quote(?:=".*?")?:$uid\]).)?#is' => function ($match) {
|
||||||
|
return $this->bbcode_second_pass_quote($match[1], $match[2]);
|
||||||
|
},
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
@ -293,7 +306,9 @@ class bbcode
|
||||||
case 8:
|
case 8:
|
||||||
$this->bbcode_cache[$bbcode_id] = array(
|
$this->bbcode_cache[$bbcode_id] = array(
|
||||||
'preg' => array(
|
'preg' => array(
|
||||||
'#\[code(?:=([a-z]+))?:$uid\](.*?)\[/code:$uid\]#ise' => "\$this->bbcode_second_pass_code('\$1', '\$2')",
|
'#\[code(?:=([a-z]+))?:$uid\](.*?)\[/code:$uid\]#is' => function ($match) {
|
||||||
|
return $this->bbcode_second_pass_code($match[1], $match[2]);
|
||||||
|
},
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
@ -303,7 +318,9 @@ class bbcode
|
||||||
'preg' => array(
|
'preg' => array(
|
||||||
'#(\[\/?(list|\*):[mou]?:?$uid\])[\n]{1}#' => "\$1",
|
'#(\[\/?(list|\*):[mou]?:?$uid\])[\n]{1}#' => "\$1",
|
||||||
'#(\[list=([^\[]+):$uid\])[\n]{1}#' => "\$1",
|
'#(\[list=([^\[]+):$uid\])[\n]{1}#' => "\$1",
|
||||||
'#\[list=([^\[]+):$uid\]#e' => "\$this->bbcode_list('\$1')",
|
'#\[list=([^\[]+):$uid\]#' => function ($match) {
|
||||||
|
return $this->bbcode_list($match[1]);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
'str' => array(
|
'str' => array(
|
||||||
'[list:$uid]' => $this->bbcode_tpl('ulist_open_default', $bbcode_id),
|
'[list:$uid]' => $this->bbcode_tpl('ulist_open_default', $bbcode_id),
|
||||||
|
@ -387,7 +404,9 @@ class bbcode
|
||||||
}
|
}
|
||||||
|
|
||||||
// Replace {L_*} lang strings
|
// Replace {L_*} lang strings
|
||||||
$bbcode_tpl = preg_replace('/{L_([A-Z0-9_]+)}/e', "(!empty(\$user->lang['\$1'])) ? \$user->lang['\$1'] : ucwords(strtolower(str_replace('_', ' ', '\$1')))", $bbcode_tpl);
|
$bbcode_tpl = preg_replace_callback('/{L_([A-Z0-9_]+)}/', function ($match) use ($user) {
|
||||||
|
return (!empty($user->lang[$match[1]])) ? $user->lang($match[1]) : ucwords(strtolower(str_replace('_', ' ', $match[1])));
|
||||||
|
}, $bbcode_tpl);
|
||||||
|
|
||||||
if (!empty($rowset[$bbcode_id]['second_pass_replace']))
|
if (!empty($rowset[$bbcode_id]['second_pass_replace']))
|
||||||
{
|
{
|
||||||
|
@ -511,7 +530,9 @@ class bbcode
|
||||||
'email' => array('{EMAIL}' => '$1', '{DESCRIPTION}' => '$2')
|
'email' => array('{EMAIL}' => '$1', '{DESCRIPTION}' => '$2')
|
||||||
);
|
);
|
||||||
|
|
||||||
$tpl = preg_replace('/{L_([A-Z0-9_]+)}/e', "(!empty(\$user->lang['\$1'])) ? \$user->lang['\$1'] : ucwords(strtolower(str_replace('_', ' ', '\$1')))", $tpl);
|
$tpl = preg_replace_callback('/{L_([A-Z0-9_]+)}/', function ($match) use ($user) {
|
||||||
|
return (!empty($user->lang[$match[1]])) ? $user->lang($match[1]) : ucwords(strtolower(str_replace('_', ' ', $match[1])));
|
||||||
|
}, $tpl);
|
||||||
|
|
||||||
if (!empty($replacements[$tpl_name]))
|
if (!empty($replacements[$tpl_name]))
|
||||||
{
|
{
|
||||||
|
|
|
@ -83,7 +83,14 @@ class bbcode_firstpass extends bbcode
|
||||||
// it should not demand recompilation
|
// it should not demand recompilation
|
||||||
if (preg_match($regexp, $this->message))
|
if (preg_match($regexp, $this->message))
|
||||||
{
|
{
|
||||||
$this->message = preg_replace($regexp, $replacement, $this->message);
|
if (is_callable($replacement))
|
||||||
|
{
|
||||||
|
$this->message = preg_replace_callback($regexp, $replacement, $this->message);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->message = preg_replace($regexp, $replacement, $this->message);
|
||||||
|
}
|
||||||
$bitfield->set($bbcode_data['bbcode_id']);
|
$bitfield->set($bbcode_data['bbcode_id']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -123,6 +130,8 @@ class bbcode_firstpass extends bbcode
|
||||||
|
|
||||||
static $rowset;
|
static $rowset;
|
||||||
|
|
||||||
|
$bbcode_class = $this;
|
||||||
|
|
||||||
// This array holds all bbcode data. BBCodes will be processed in this
|
// This array holds all bbcode data. BBCodes will be processed in this
|
||||||
// order, so it is important to keep [code] in first position and
|
// order, so it is important to keep [code] in first position and
|
||||||
// [quote] in second position.
|
// [quote] in second position.
|
||||||
|
@ -132,19 +141,71 @@ class bbcode_firstpass extends bbcode
|
||||||
// To perform custom validation in extension, use $this->validate_bbcode_by_extension()
|
// To perform custom validation in extension, use $this->validate_bbcode_by_extension()
|
||||||
// method which accepts variable number of parameters
|
// method which accepts variable number of parameters
|
||||||
$this->bbcodes = array(
|
$this->bbcodes = array(
|
||||||
'code' => array('bbcode_id' => 8, 'regexp' => array('#\[code(?:=([a-z]+))?\](.+\[/code\])#uise' => "\$this->bbcode_code('\$1', '\$2')")),
|
'code' => array('bbcode_id' => 8, 'regexp' => array('#\[code(?:=([a-z]+))?\](.+\[/code\])#uis' => function ($match) use($bbcode_class)
|
||||||
'quote' => array('bbcode_id' => 0, 'regexp' => array('#\[quote(?:="(.*?)")?\](.+)\[/quote\]#uise' => "\$this->bbcode_quote('\$0')")),
|
{
|
||||||
'attachment' => array('bbcode_id' => 12, 'regexp' => array('#\[attachment=([0-9]+)\](.*?)\[/attachment\]#uise' => "\$this->bbcode_attachment('\$1', '\$2')")),
|
return $bbcode_class->bbcode_code($match[1], $match[2]);
|
||||||
'b' => array('bbcode_id' => 1, 'regexp' => array('#\[b\](.*?)\[/b\]#uise' => "\$this->bbcode_strong('\$1')")),
|
}
|
||||||
'i' => array('bbcode_id' => 2, 'regexp' => array('#\[i\](.*?)\[/i\]#uise' => "\$this->bbcode_italic('\$1')")),
|
)),
|
||||||
'url' => array('bbcode_id' => 3, 'regexp' => array('#\[url(=(.*))?\](?(1)((?s).*(?-s))|(.*))\[/url\]#uiUe' => "\$this->validate_url('\$2', ('\$3') ? '\$3' : '\$4')")),
|
'quote' => array('bbcode_id' => 0, 'regexp' => array('#\[quote(?:="(.*?)")?\](.+)\[/quote\]#uis' => function ($match) use($bbcode_class)
|
||||||
'img' => array('bbcode_id' => 4, 'regexp' => array('#\[img\](.*)\[/img\]#uiUe' => "\$this->bbcode_img('\$1')")),
|
{
|
||||||
'size' => array('bbcode_id' => 5, 'regexp' => array('#\[size=([\-\+]?\d+)\](.*?)\[/size\]#uise' => "\$this->bbcode_size('\$1', '\$2')")),
|
return $bbcode_class->bbcode_quote($match[0]);
|
||||||
'color' => array('bbcode_id' => 6, 'regexp' => array('!\[color=(#[0-9a-f]{3}|#[0-9a-f]{6}|[a-z\-]+)\](.*?)\[/color\]!uise' => "\$this->bbcode_color('\$1', '\$2')")),
|
}
|
||||||
'u' => array('bbcode_id' => 7, 'regexp' => array('#\[u\](.*?)\[/u\]#uise' => "\$this->bbcode_underline('\$1')")),
|
)),
|
||||||
'list' => array('bbcode_id' => 9, 'regexp' => array('#\[list(?:=(?:[a-z0-9]|disc|circle|square))?].*\[/list]#uise' => "\$this->bbcode_parse_list('\$0')")),
|
'attachment' => array('bbcode_id' => 12, 'regexp' => array('#\[attachment=([0-9]+)\](.*?)\[/attachment\]#uis' => function ($match) use($bbcode_class)
|
||||||
'email' => array('bbcode_id' => 10, 'regexp' => array('#\[email=?(.*?)?\](.*?)\[/email\]#uise' => "\$this->validate_email('\$1', '\$2')")),
|
{
|
||||||
'flash' => array('bbcode_id' => 11, 'regexp' => array('#\[flash=([0-9]+),([0-9]+)\](.*?)\[/flash\]#uie' => "\$this->bbcode_flash('\$1', '\$2', '\$3')"))
|
return $bbcode_class->bbcode_attachment($match[1], $match[2]);
|
||||||
|
}
|
||||||
|
)),
|
||||||
|
'b' => array('bbcode_id' => 1, 'regexp' => array('#\[b\](.*?)\[/b\]#uis' => function ($match) use($bbcode_class)
|
||||||
|
{
|
||||||
|
return $bbcode_class->bbcode_strong($match[1]);
|
||||||
|
}
|
||||||
|
)),
|
||||||
|
'i' => array('bbcode_id' => 2, 'regexp' => array('#\[i\](.*?)\[/i\]#uis' => function ($match) use($bbcode_class)
|
||||||
|
{
|
||||||
|
return $bbcode_class->bbcode_italic($match[1]);
|
||||||
|
}
|
||||||
|
)),
|
||||||
|
'url' => array('bbcode_id' => 3, 'regexp' => array('#\[url(=(.*))?\](?(1)((?s).*(?-s))|(.*))\[/url\]#uiU' => function ($match) use($bbcode_class)
|
||||||
|
{
|
||||||
|
return $bbcode_class->validate_url($match[2], ($match[3]) ? $match[3] : $match[4]);
|
||||||
|
}
|
||||||
|
)),
|
||||||
|
'img' => array('bbcode_id' => 4, 'regexp' => array('#\[img\](.*)\[/img\]#uiU' => function ($match) use($bbcode_class)
|
||||||
|
{
|
||||||
|
return $bbcode_class->bbcode_img($match[1]);
|
||||||
|
}
|
||||||
|
)),
|
||||||
|
'size' => array('bbcode_id' => 5, 'regexp' => array('#\[size=([\-\+]?\d+)\](.*?)\[/size\]#uis' => function ($match) use($bbcode_class)
|
||||||
|
{
|
||||||
|
return $bbcode_class->bbcode_size($match[1], $match[2]);
|
||||||
|
}
|
||||||
|
)),
|
||||||
|
'color' => array('bbcode_id' => 6, 'regexp' => array('!\[color=(#[0-9a-f]{3}|#[0-9a-f]{6}|[a-z\-]+)\](.*?)\[/color\]!uis' => function ($match) use($bbcode_class)
|
||||||
|
{
|
||||||
|
return $bbcode_class->bbcode_color($match[1], $match[2]);
|
||||||
|
}
|
||||||
|
)),
|
||||||
|
'u' => array('bbcode_id' => 7, 'regexp' => array('#\[u\](.*?)\[/u\]#uis' => function ($match) use($bbcode_class)
|
||||||
|
{
|
||||||
|
return $bbcode_class->bbcode_underline($match[1]);
|
||||||
|
}
|
||||||
|
)),
|
||||||
|
'list' => array('bbcode_id' => 9, 'regexp' => array('#\[list(?:=(?:[a-z0-9]|disc|circle|square))?].*\[/list]#uis' => function ($match) use($bbcode_class)
|
||||||
|
{
|
||||||
|
return $bbcode_class->bbcode_parse_list($match[0]);
|
||||||
|
}
|
||||||
|
)),
|
||||||
|
'email' => array('bbcode_id' => 10, 'regexp' => array('#\[email=?(.*?)?\](.*?)\[/email\]#uis' => function ($match) use($bbcode_class)
|
||||||
|
{
|
||||||
|
return $bbcode_class->validate_email($match[1], $match[2]);
|
||||||
|
}
|
||||||
|
)),
|
||||||
|
'flash' => array('bbcode_id' => 11, 'regexp' => array('#\[flash=([0-9]+),([0-9]+)\](.*?)\[/flash\]#ui' => function ($match) use($bbcode_class)
|
||||||
|
{
|
||||||
|
return $bbcode_class->bbcode_flash($match[1], $match[2], $match[3]);
|
||||||
|
}
|
||||||
|
))
|
||||||
);
|
);
|
||||||
|
|
||||||
// Zero the parsed items array
|
// Zero the parsed items array
|
||||||
|
@ -747,7 +808,9 @@ class bbcode_firstpass extends bbcode
|
||||||
}
|
}
|
||||||
|
|
||||||
// To let the parser not catch tokens within quote_username quotes we encode them before we start this...
|
// To let the parser not catch tokens within quote_username quotes we encode them before we start this...
|
||||||
$in = preg_replace('#quote="(.*?)"\]#ie', "'quote="' . str_replace(array('[', ']', '\\\"'), array('[', ']', '\"'), '\$1') . '"]'", $in);
|
$in = preg_replace_callback('#quote="(.*?)"\]#i', function ($match) {
|
||||||
|
return 'quote="' . str_replace(array('[', ']', '\\\"'), array('[', ']', '\"'), $match[1]) . '"]';
|
||||||
|
}, $in);
|
||||||
|
|
||||||
$tok = ']';
|
$tok = ']';
|
||||||
$out = '[';
|
$out = '[';
|
||||||
|
@ -1536,7 +1599,9 @@ class parse_message extends bbcode_firstpass
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->attachment_data = array_merge(array(0 => $new_entry), $this->attachment_data);
|
$this->attachment_data = array_merge(array(0 => $new_entry), $this->attachment_data);
|
||||||
$this->message = preg_replace('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#e', "'[attachment='.(\\1 + 1).']\\2[/attachment]'", $this->message);
|
$this->message = preg_replace_callback('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#', function ($match) {
|
||||||
|
return '[attachment='.($match[1] + 1).']' . $match[2] . '[/attachment]';
|
||||||
|
}, $this->message);
|
||||||
|
|
||||||
$this->filename_data['filecomment'] = '';
|
$this->filename_data['filecomment'] = '';
|
||||||
|
|
||||||
|
@ -1604,7 +1669,9 @@ class parse_message extends bbcode_firstpass
|
||||||
}
|
}
|
||||||
|
|
||||||
unset($this->attachment_data[$index]);
|
unset($this->attachment_data[$index]);
|
||||||
$this->message = preg_replace('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#e', "(\\1 == \$index) ? '' : ((\\1 > \$index) ? '[attachment=' . (\\1 - 1) . ']\\2[/attachment]' : '\\0')", $this->message);
|
$this->message = preg_replace_callback('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#', function ($match) use($index) {
|
||||||
|
return ($match[1] == $index) ? '' : (($match[1] > $index) ? '[attachment=' . ($match[1] - 1) . ']' . $match[2] . '[/attachment]' : $match[0]);
|
||||||
|
}, $this->message);
|
||||||
|
|
||||||
// Reindex Array
|
// Reindex Array
|
||||||
$this->attachment_data = array_values($this->attachment_data);
|
$this->attachment_data = array_values($this->attachment_data);
|
||||||
|
@ -1648,7 +1715,9 @@ class parse_message extends bbcode_firstpass
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->attachment_data = array_merge(array(0 => $new_entry), $this->attachment_data);
|
$this->attachment_data = array_merge(array(0 => $new_entry), $this->attachment_data);
|
||||||
$this->message = preg_replace('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#e', "'[attachment='.(\\1 + 1).']\\2[/attachment]'", $this->message);
|
$this->message = preg_replace_callback('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#', function ($match) {
|
||||||
|
return '[attachment=' . ($match[1] + 1) . ']' . $match[2] . '[/attachment]';
|
||||||
|
}, $this->message);
|
||||||
$this->filename_data['filecomment'] = '';
|
$this->filename_data['filecomment'] = '';
|
||||||
|
|
||||||
if (isset($this->plupload) && $this->plupload->is_active())
|
if (isset($this->plupload) && $this->plupload->is_active())
|
||||||
|
|
|
@ -507,7 +507,9 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit
|
||||||
$rule_lang = $action_lang = $check_lang = array();
|
$rule_lang = $action_lang = $check_lang = array();
|
||||||
|
|
||||||
// Build all three language arrays
|
// Build all three language arrays
|
||||||
preg_replace('#^((RULE|ACTION|CHECK)_([A-Z0-9_]+))$#e', "\${strtolower('\\2') . '_lang'}[constant('\\1')] = \$user->lang['PM_\\2']['\\3']", array_keys(get_defined_constants()));
|
preg_replace_callback('#^((RULE|ACTION|CHECK)_([A-Z0-9_]+))$#', function ($match) use(&$rule_lang, &$action_lang, &$check_lang, $user) {
|
||||||
|
${strtolower($match[2]) . '_lang'}[constant($match[1])] = $user->lang['PM_' . $match[2]][$match[3]];
|
||||||
|
}, array_keys(get_defined_constants()));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Rule Ordering:
|
Rule Ordering:
|
||||||
|
|
Loading…
Add table
Reference in a new issue