phpBB
Statistics
| Revision:

root / branches / phpBB-3_0_0 / phpBB / includes / acp / acp_bbcodes.php

History | View | Annotate | Download (14.6 kB)

1 5310 acydburn
<?php
2 7736 acydburn
/**
3 5310 acydburn
*
4 5310 acydburn
* @package acp
5 5310 acydburn
* @version $Id$
6 7736 acydburn
* @copyright (c) 2005 phpBB Group
7 7736 acydburn
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
8 5310 acydburn
*
9 5310 acydburn
*/
10 5310 acydburn
11 5310 acydburn
/**
12 8147 acydburn
* @ignore
13 8147 acydburn
*/
14 8147 acydburn
if (!defined('IN_PHPBB'))
15 8147 acydburn
{
16 8147 acydburn
        exit;
17 8147 acydburn
}
18 8147 acydburn
19 8147 acydburn
/**
20 5310 acydburn
* @package acp
21 5310 acydburn
*/
22 5310 acydburn
class acp_bbcodes
23 5310 acydburn
{
24 5558 acydburn
        var $u_action;
25 5558 acydburn
26 5310 acydburn
        function main($id, $mode)
27 5310 acydburn
        {
28 5310 acydburn
                global $db, $user, $auth, $template, $cache;
29 6015 acydburn
                global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
30 5310 acydburn
31 5310 acydburn
                $user->add_lang('acp/posting');
32 5310 acydburn
33 5310 acydburn
                // Set up general vars
34 5310 acydburn
                $action        = request_var('action', '');
35 5310 acydburn
                $bbcode_id = request_var('bbcode', 0);
36 10551 naderman
37 5310 acydburn
                $this->tpl_name = 'acp_bbcodes';
38 5313 acydburn
                $this->page_title = 'ACP_BBCODES';
39 8120 kellanved
                $form_key = 'acp_bbcodes';
40 5310 acydburn
41 8120 kellanved
                add_form_key($form_key);
42 8120 kellanved
43 5310 acydburn
                // Set up mode-specific vars
44 5310 acydburn
                switch ($action)
45 5310 acydburn
                {
46 5310 acydburn
                        case 'add':
47 6223 davidmj
                                $bbcode_match = $bbcode_tpl = $bbcode_helpline = '';
48 5603 acydburn
                                $display_on_posting = 0;
49 5310 acydburn
                        break;
50 5310 acydburn
51 5310 acydburn
                        case 'edit':
52 6256 acydburn
                                $sql = 'SELECT bbcode_match, bbcode_tpl, display_on_posting, bbcode_helpline
53 5310 acydburn
                                        FROM ' . BBCODES_TABLE . '
54 5310 acydburn
                                        WHERE bbcode_id = ' . $bbcode_id;
55 5310 acydburn
                                $result = $db->sql_query($sql);
56 6073 acydburn
                                $row = $db->sql_fetchrow($result);
57 6073 acydburn
                                $db->sql_freeresult($result);
58 5310 acydburn
59 6073 acydburn
                                if (!$row)
60 5310 acydburn
                                {
61 6428 acydburn
                                        trigger_error($user->lang['BBCODE_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING);
62 5310 acydburn
                                }
63 5310 acydburn
64 5310 acydburn
                                $bbcode_match = $row['bbcode_match'];
65 5310 acydburn
                                $bbcode_tpl = htmlspecialchars($row['bbcode_tpl']);
66 5603 acydburn
                                $display_on_posting = $row['display_on_posting'];
67 6434 davidmj
                                $bbcode_helpline = $row['bbcode_helpline'];
68 5310 acydburn
                        break;
69 5310 acydburn
70 5310 acydburn
                        case 'modify':
71 6077 davidmj
                                $sql = 'SELECT bbcode_id, bbcode_tag
72 5310 acydburn
                                        FROM ' . BBCODES_TABLE . '
73 5310 acydburn
                                        WHERE bbcode_id = ' . $bbcode_id;
74 5310 acydburn
                                $result = $db->sql_query($sql);
75 6073 acydburn
                                $row = $db->sql_fetchrow($result);
76 6073 acydburn
                                $db->sql_freeresult($result);
77 5310 acydburn
78 6073 acydburn
                                if (!$row)
79 5310 acydburn
                                {
80 6428 acydburn
                                        trigger_error($user->lang['BBCODE_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING);
81 5310 acydburn
                                }
82 5310 acydburn
83 6073 acydburn
                        // No break here
84 5310 acydburn
85 5310 acydburn
                        case 'create':
86 5603 acydburn
                                $display_on_posting = request_var('display_on_posting', 0);
87 5603 acydburn
88 5957 acydburn
                                $bbcode_match = request_var('bbcode_match', '');
89 7920 acydburn
                                $bbcode_tpl = htmlspecialchars_decode(utf8_normalize_nfc(request_var('bbcode_tpl', '', true)));
90 7920 acydburn
                                $bbcode_helpline = utf8_normalize_nfc(request_var('bbcode_helpline', '', true));
91 5310 acydburn
                        break;
92 5310 acydburn
                }
93 5310 acydburn
94 5310 acydburn
                // Do major work
95 5310 acydburn
                switch ($action)
96 5310 acydburn
                {
97 5310 acydburn
                        case 'edit':
98 5310 acydburn
                        case 'add':
99 5310 acydburn
100 5310 acydburn
                                $template->assign_vars(array(
101 5310 acydburn
                                        'S_EDIT_BBCODE'                => true,
102 5558 acydburn
                                        'U_BACK'                        => $this->u_action,
103 5558 acydburn
                                        'U_ACTION'                        => $this->u_action . '&amp;action=' . (($action == 'add') ? 'create' : 'modify') . (($bbcode_id) ? "&amp;bbcode=$bbcode_id" : ''),
104 5310 acydburn
105 6133 davidmj
                                        'L_BBCODE_USAGE_EXPLAIN'=> sprintf($user->lang['BBCODE_USAGE_EXPLAIN'], '<a href="#down">', '</a>'),
106 5603 acydburn
                                        'BBCODE_MATCH'                        => $bbcode_match,
107 5603 acydburn
                                        'BBCODE_TPL'                        => $bbcode_tpl,
108 6223 davidmj
                                        'BBCODE_HELPLINE'                => $bbcode_helpline,
109 5603 acydburn
                                        'DISPLAY_ON_POSTING'        => $display_on_posting)
110 5310 acydburn
                                );
111 5310 acydburn
112 5310 acydburn
                                foreach ($user->lang['tokens'] as $token => $token_explain)
113 5310 acydburn
                                {
114 5310 acydburn
                                        $template->assign_block_vars('token', array(
115 5310 acydburn
                                                'TOKEN'                => '{' . $token . '}',
116 5310 acydburn
                                                'EXPLAIN'        => $token_explain)
117 5310 acydburn
                                        );
118 5310 acydburn
                                }
119 5310 acydburn
120 5310 acydburn
                                return;
121 5310 acydburn
122 5310 acydburn
                        break;
123 5310 acydburn
124 5310 acydburn
                        case 'modify':
125 5310 acydburn
                        case 'create':
126 10551 naderman
127 10511 Kellanved
                                $warn_text = preg_match('%<[^>]*\{text[\d]*\}[^>]*>%i', $bbcode_tpl);
128 10511 Kellanved
                                if (!$warn_text || confirm_box(true))
129 10511 Kellanved
                                {
130 10511 Kellanved
                                        $data = $this->build_regexp($bbcode_match, $bbcode_tpl);
131 5310 acydburn
132 10511 Kellanved
                                        // Make sure the user didn't pick a "bad" name for the BBCode tag.
133 10511 Kellanved
                                        $hard_coded = array('code', 'quote', 'quote=', 'attachment', 'attachment=', 'b', 'i', 'url', 'url=', 'img', 'size', 'size=', 'color', 'color=', 'u', 'list', 'list=', 'email', 'email=', 'flash', 'flash=');
134 5310 acydburn
135 10511 Kellanved
                                        if (($action == 'modify' && strtolower($data['bbcode_tag']) !== strtolower($row['bbcode_tag'])) || ($action == 'create'))
136 10511 Kellanved
                                        {
137 10511 Kellanved
                                                $sql = 'SELECT 1 as test
138 10511 Kellanved
                                                        FROM ' . BBCODES_TABLE . "
139 10511 Kellanved
                                                        WHERE LOWER(bbcode_tag) = '" . $db->sql_escape(strtolower($data['bbcode_tag'])) . "'";
140 10511 Kellanved
                                                $result = $db->sql_query($sql);
141 10511 Kellanved
                                                $info = $db->sql_fetchrow($result);
142 10511 Kellanved
                                                $db->sql_freeresult($result);
143 6077 davidmj
144 10511 Kellanved
                                                // Grab the end, interrogate the last closing tag
145 10511 Kellanved
                                                if ($info['test'] === '1' || in_array(strtolower($data['bbcode_tag']), $hard_coded) || (preg_match('#\[/([^[]*)]$#', $bbcode_match, $regs) && in_array(strtolower($regs[1]), $hard_coded)))
146 10511 Kellanved
                                                {
147 10511 Kellanved
                                                        trigger_error($user->lang['BBCODE_INVALID_TAG_NAME'] . adm_back_link($this->u_action), E_USER_WARNING);
148 10511 Kellanved
                                                }
149 10511 Kellanved
                                        }
150 6077 davidmj
151 10511 Kellanved
                                        if (substr($data['bbcode_tag'], -1) === '=')
152 6077 davidmj
                                        {
153 10511 Kellanved
                                                $test = substr($data['bbcode_tag'], 0, -1);
154 6077 davidmj
                                        }
155 10511 Kellanved
                                        else
156 10511 Kellanved
                                        {
157 10511 Kellanved
                                                $test = $data['bbcode_tag'];
158 10511 Kellanved
                                        }
159 6077 davidmj
160 10511 Kellanved
                                        if (!preg_match('%\\[' . $test . '[^]]*].*?\\[/' . $test . ']%s', $bbcode_match))
161 10511 Kellanved
                                        {
162 10511 Kellanved
                                                trigger_error($user->lang['BBCODE_OPEN_ENDED_TAG'] . adm_back_link($this->u_action), E_USER_WARNING);
163 10511 Kellanved
                                        }
164 6691 davidmj
165 10511 Kellanved
                                        if (strlen($data['bbcode_tag']) > 16)
166 10511 Kellanved
                                        {
167 10511 Kellanved
                                                trigger_error($user->lang['BBCODE_TAG_TOO_LONG'] . adm_back_link($this->u_action), E_USER_WARNING);
168 10511 Kellanved
                                        }
169 6608 davidmj
170 10511 Kellanved
                                        if (strlen($bbcode_match) > 4000)
171 10511 Kellanved
                                        {
172 10511 Kellanved
                                                trigger_error($user->lang['BBCODE_TAG_DEF_TOO_LONG'] . adm_back_link($this->u_action), E_USER_WARNING);
173 10511 Kellanved
                                        }
174 10551 naderman
175 10551 naderman
176 10511 Kellanved
                                        if (strlen($bbcode_helpline) > 255)
177 10511 Kellanved
                                        {
178 10511 Kellanved
                                                trigger_error($user->lang['BBCODE_HELPLINE_TOO_LONG'] . adm_back_link($this->u_action), E_USER_WARNING);
179 10511 Kellanved
                                        }
180 6880 davidmj
181 10511 Kellanved
                                        $sql_ary = array(
182 10511 Kellanved
                                                'bbcode_tag'                                => $data['bbcode_tag'],
183 10511 Kellanved
                                                'bbcode_match'                                => $bbcode_match,
184 10511 Kellanved
                                                'bbcode_tpl'                                => $bbcode_tpl,
185 10511 Kellanved
                                                'display_on_posting'                => $display_on_posting,
186 10511 Kellanved
                                                'bbcode_helpline'                        => $bbcode_helpline,
187 10511 Kellanved
                                                'first_pass_match'                        => $data['first_pass_match'],
188 10511 Kellanved
                                                'first_pass_replace'                => $data['first_pass_replace'],
189 10511 Kellanved
                                                'second_pass_match'                        => $data['second_pass_match'],
190 10511 Kellanved
                                                'second_pass_replace'                => $data['second_pass_replace']
191 10511 Kellanved
                                        );
192 6880 davidmj
193 10511 Kellanved
                                        if ($action == 'create')
194 5310 acydburn
                                        {
195 10511 Kellanved
                                                $sql = 'SELECT MAX(bbcode_id) as max_bbcode_id
196 10511 Kellanved
                                                        FROM ' . BBCODES_TABLE;
197 10511 Kellanved
                                                $result = $db->sql_query($sql);
198 10511 Kellanved
                                                $row = $db->sql_fetchrow($result);
199 10511 Kellanved
                                                $db->sql_freeresult($result);
200 5310 acydburn
201 10511 Kellanved
                                                if ($row)
202 5310 acydburn
                                                {
203 10511 Kellanved
                                                        $bbcode_id = $row['max_bbcode_id'] + 1;
204 10511 Kellanved
205 10511 Kellanved
                                                        // Make sure it is greater than the core bbcode ids...
206 10511 Kellanved
                                                        if ($bbcode_id <= NUM_CORE_BBCODES)
207 10511 Kellanved
                                                        {
208 10511 Kellanved
                                                                $bbcode_id = NUM_CORE_BBCODES + 1;
209 10511 Kellanved
                                                        }
210 10511 Kellanved
                                                }
211 10511 Kellanved
                                                else
212 10511 Kellanved
                                                {
213 5310 acydburn
                                                        $bbcode_id = NUM_CORE_BBCODES + 1;
214 5310 acydburn
                                                }
215 10511 Kellanved
216 10984 git-gate
                                                if ($bbcode_id > BBCODE_LIMIT)
217 10511 Kellanved
                                                {
218 10511 Kellanved
                                                        trigger_error($user->lang['TOO_MANY_BBCODES'] . adm_back_link($this->u_action), E_USER_WARNING);
219 10511 Kellanved
                                                }
220 10511 Kellanved
221 10511 Kellanved
                                                $sql_ary['bbcode_id'] = (int) $bbcode_id;
222 10511 Kellanved
223 10511 Kellanved
                                                $db->sql_query('INSERT INTO ' . BBCODES_TABLE . $db->sql_build_array('INSERT', $sql_ary));
224 10511 Kellanved
                                                $cache->destroy('sql', BBCODES_TABLE);
225 10511 Kellanved
226 10511 Kellanved
                                                $lang = 'BBCODE_ADDED';
227 10511 Kellanved
                                                $log_action = 'LOG_BBCODE_ADD';
228 5310 acydburn
                                        }
229 5672 acydburn
                                        else
230 5672 acydburn
                                        {
231 10511 Kellanved
                                                $sql = 'UPDATE ' . BBCODES_TABLE . '
232 10511 Kellanved
                                                        SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
233 10511 Kellanved
                                                        WHERE bbcode_id = ' . $bbcode_id;
234 10511 Kellanved
                                                $db->sql_query($sql);
235 10511 Kellanved
                                                $cache->destroy('sql', BBCODES_TABLE);
236 5310 acydburn
237 10511 Kellanved
                                                $lang = 'BBCODE_EDITED';
238 10511 Kellanved
                                                $log_action = 'LOG_BBCODE_EDIT';
239 5310 acydburn
                                        }
240 5310 acydburn
241 10511 Kellanved
                                        add_log('admin', $log_action, $data['bbcode_tag']);
242 5310 acydburn
243 10511 Kellanved
                                        trigger_error($user->lang[$lang] . adm_back_link($this->u_action));
244 5310 acydburn
                                }
245 5310 acydburn
                                else
246 10551 naderman
                                {
247 10511 Kellanved
                                        confirm_box(false, $user->lang['BBCODE_DANGER'], build_hidden_fields(array(
248 10511 Kellanved
                                                'action'                                => $action,
249 10511 Kellanved
                                                'bbcode'                                => $bbcode_id,
250 10511 Kellanved
                                                'bbcode_match'                        => $bbcode_match,
251 10511 Kellanved
                                                'bbcode_tpl'                        => htmlspecialchars($bbcode_tpl),
252 10511 Kellanved
                                                'bbcode_helpline'                => $bbcode_helpline,
253 10511 Kellanved
                                                'display_on_posting'        => $display_on_posting,
254 10511 Kellanved
                                                ))
255 10511 Kellanved
                                        , 'confirm_bbcode.html');
256 5310 acydburn
                                }
257 5310 acydburn
258 5310 acydburn
                        break;
259 5310 acydburn
260 5310 acydburn
                        case 'delete':
261 5603 acydburn
262 5310 acydburn
                                $sql = 'SELECT bbcode_tag
263 5310 acydburn
                                        FROM ' . BBCODES_TABLE . "
264 5310 acydburn
                                        WHERE bbcode_id = $bbcode_id";
265 5310 acydburn
                                $result = $db->sql_query($sql);
266 6073 acydburn
                                $row = $db->sql_fetchrow($result);
267 6073 acydburn
                                $db->sql_freeresult($result);
268 6073 acydburn
269 6073 acydburn
                                if ($row)
270 5310 acydburn
                                {
271 6414 acydburn
                                        if (confirm_box(true))
272 6414 acydburn
                                        {
273 6414 acydburn
                                                $db->sql_query('DELETE FROM ' . BBCODES_TABLE . " WHERE bbcode_id = $bbcode_id");
274 6432 davidmj
                                                $cache->destroy('sql', BBCODES_TABLE);
275 6414 acydburn
                                                add_log('admin', 'LOG_BBCODE_DELETE', $row['bbcode_tag']);
276 6414 acydburn
                                        }
277 6414 acydburn
                                        else
278 6414 acydburn
                                        {
279 6414 acydburn
                                                confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
280 6414 acydburn
                                                        'bbcode'        => $bbcode_id,
281 6414 acydburn
                                                        'i'                        => $id,
282 6414 acydburn
                                                        'mode'                => $mode,
283 6414 acydburn
                                                        'action'        => $action))
284 6414 acydburn
                                                );
285 6414 acydburn
                                        }
286 5310 acydburn
                                }
287 5310 acydburn
288 5310 acydburn
                        break;
289 5310 acydburn
                }
290 5310 acydburn
291 5310 acydburn
                $template->assign_vars(array(
292 5603 acydburn
                        'U_ACTION'                => $this->u_action . '&amp;action=add')
293 5310 acydburn
                );
294 5310 acydburn
295 5310 acydburn
                $sql = 'SELECT *
296 5310 acydburn
                        FROM ' . BBCODES_TABLE . '
297 6606 davidmj
                        ORDER BY bbcode_tag';
298 5310 acydburn
                $result = $db->sql_query($sql);
299 5310 acydburn
300 5310 acydburn
                while ($row = $db->sql_fetchrow($result))
301 5310 acydburn
                {
302 5310 acydburn
                        $template->assign_block_vars('bbcodes', array(
303 5310 acydburn
                                'BBCODE_TAG'                => $row['bbcode_tag'],
304 5558 acydburn
                                'U_EDIT'                        => $this->u_action . '&amp;action=edit&amp;bbcode=' . $row['bbcode_id'],
305 5558 acydburn
                                'U_DELETE'                        => $this->u_action . '&amp;action=delete&amp;bbcode=' . $row['bbcode_id'])
306 5310 acydburn
                        );
307 5310 acydburn
                }
308 5310 acydburn
                $db->sql_freeresult($result);
309 5310 acydburn
        }
310 5310 acydburn
311 5310 acydburn
        /*
312 5310 acydburn
        * Build regular expression for custom bbcode
313 5310 acydburn
        */
314 5957 acydburn
        function build_regexp(&$bbcode_match, &$bbcode_tpl)
315 5310 acydburn
        {
316 5957 acydburn
                $bbcode_match = trim($bbcode_match);
317 5957 acydburn
                $bbcode_tpl = trim($bbcode_tpl);
318 10516 Kellanved
                $utf8 = strpos($bbcode_match, 'INTTEXT') !== false;
319 5310 acydburn
320 10551 naderman
                // make sure we have utf8 support
321 10551 naderman
                $utf8_pcre_properties = false;
322 10551 naderman
                if (version_compare(PHP_VERSION, '5.1.0', '>=') || (version_compare(PHP_VERSION, '5.0.0-dev', '<=') && version_compare(PHP_VERSION, '4.4.0', '>=')))
323 10551 naderman
                {
324 10551 naderman
                        // While this is the proper range of PHP versions, PHP may not be linked with the bundled PCRE lib and instead with an older version
325 10551 naderman
                        if (@preg_match('/\p{L}/u', 'a') !== false)
326 10551 naderman
                        {
327 10551 naderman
                                $utf8_pcre_properties = true;
328 10551 naderman
                        }
329 10551 naderman
                }
330 10551 naderman
331 5957 acydburn
                $fp_match = preg_quote($bbcode_match, '!');
332 5957 acydburn
                $fp_replace = preg_replace('#^\[(.*?)\]#', '[$1:$uid]', $bbcode_match);
333 5310 acydburn
                $fp_replace = preg_replace('#\[/(.*?)\]$#', '[/$1:$uid]', $fp_replace);
334 5310 acydburn
335 5957 acydburn
                $sp_match = preg_quote($bbcode_match, '!');
336 5310 acydburn
                $sp_match = preg_replace('#^\\\\\[(.*?)\\\\\]#', '\[$1:$uid\]', $sp_match);
337 5310 acydburn
                $sp_match = preg_replace('#\\\\\[/(.*?)\\\\\]$#', '\[/$1:$uid\]', $sp_match);
338 5957 acydburn
                $sp_replace = $bbcode_tpl;
339 5310 acydburn
340 5310 acydburn
                // @todo Make sure to change this too if something changed in message parsing
341 5310 acydburn
                $tokens = array(
342 5310 acydburn
                        'URL'         => array(
343 8056 naderman
                                '!(?:(' . str_replace(array('!', '\#'), array('\!', '#'), get_preg_expression('url')) . ')|(' . str_replace(array('!', '\#'), array('\!', '#'), get_preg_expression('www_url')) . '))!ie'        =>        "\$this->bbcode_specialchars(('\$1') ? '\$1' : 'http://\$2')"
344 5310 acydburn
                        ),
345 5310 acydburn
                        'LOCAL_URL'         => array(
346 8056 naderman
                                '!(' . str_replace(array('!', '\#'), array('\!', '#'), get_preg_expression('relative_url')) . ')!e'        =>        "\$this->bbcode_specialchars('$1')"
347 5310 acydburn
                        ),
348 5310 acydburn
                        'EMAIL' => array(
349 8387 acydburn
                                '!(' . get_preg_expression('email') . ')!ie'        =>        "\$this->bbcode_specialchars('$1')"
350 5310 acydburn
                        ),
351 5310 acydburn
                        'TEXT' => array(
352 8056 naderman
                                '!(.*?)!es'         =>        "str_replace(array(\"\\r\\n\", '\\\"', '\\'', '(', ')'), array(\"\\n\", '\"', '&#39;', '&#40;', '&#41;'), trim('\$1'))"
353 5310 acydburn
                        ),
354 8056 naderman
                        'SIMPLETEXT' => array(
355 8056 naderman
                                '!([a-zA-Z0-9-+.,_ ]+)!'         =>        "$1"
356 8056 naderman
                        ),
357 10516 Kellanved
                        'INTTEXT' => array(
358 10551 naderman
                                ($utf8_pcre_properties) ? '!([\p{L}\p{N}\-+,_. ]+)!u' : '!([a-zA-Z0-9\-+,_. ]+)!u'         =>        "$1"
359 10516 Kellanved
                        ),
360 8056 naderman
                        'IDENTIFIER' => array(
361 8056 naderman
                                '!([a-zA-Z0-9-_]+)!'         =>        "$1"
362 8056 naderman
                        ),
363 5310 acydburn
                        'COLOR' => array(
364 5957 acydburn
                                '!([a-z]+|#[0-9abcdef]+)!i'        =>        '$1'
365 5310 acydburn
                        ),
366 5310 acydburn
                        'NUMBER' => array(
367 5310 acydburn
                                '!([0-9]+)!'        =>        '$1'
368 5310 acydburn
                        )
369 5310 acydburn
                );
370 5310 acydburn
371 8153 naderman
                $sp_tokens = array(
372 8153 naderman
                        'URL'         => '(?i)((?:' . str_replace(array('!', '\#'), array('\!', '#'), get_preg_expression('url')) . ')|(?:' . str_replace(array('!', '\#'), array('\!', '#'), get_preg_expression('www_url')) . '))(?-i)',
373 8153 naderman
                        'LOCAL_URL'         => '(?i)(' . str_replace(array('!', '\#'), array('\!', '#'), get_preg_expression('relative_url')) . ')(?-i)',
374 8387 acydburn
                        'EMAIL' => '(' . get_preg_expression('email') . ')',
375 8153 naderman
                        'TEXT' => '(.*?)',
376 8153 naderman
                        'SIMPLETEXT' => '([a-zA-Z0-9-+.,_ ]+)',
377 10551 naderman
                        'INTTEXT' => ($utf8_pcre_properties) ? '([\p{L}\p{N}\-+,_. ]+)' : '([a-zA-Z0-9\-+,_. ]+)',
378 8153 naderman
                        'IDENTIFIER' => '([a-zA-Z0-9-_]+)',
379 8153 naderman
                        'COLOR' => '([a-zA-Z]+|#[0-9abcdefABCDEF]+)',
380 8153 naderman
                        'NUMBER' => '([0-9]+)',
381 8153 naderman
                );
382 8153 naderman
383 5678 acydburn
                $pad = 0;
384 5678 acydburn
                $modifiers = 'i';
385 10551 naderman
                $modifiers .= ($utf8 && $utf8_pcre_properties) ? 'u' : '';
386 10551 naderman
387 5957 acydburn
                if (preg_match_all('/\{(' . implode('|', array_keys($tokens)) . ')[0-9]*\}/i', $bbcode_match, $m))
388 5310 acydburn
                {
389 5310 acydburn
                        foreach ($m[0] as $n => $token)
390 5310 acydburn
                        {
391 5310 acydburn
                                $token_type = $m[1][$n];
392 5310 acydburn
393 6133 davidmj
                                reset($tokens[strtoupper($token_type)]);
394 6133 davidmj
                                list($match, $replace) = each($tokens[strtoupper($token_type)]);
395 5310 acydburn
396 5310 acydburn
                                // Pad backreference numbers from tokens
397 5310 acydburn
                                if (preg_match_all('/(?<!\\\\)\$([0-9]+)/', $replace, $repad))
398 5310 acydburn
                                {
399 5310 acydburn
                                        $repad = $pad + sizeof(array_unique($repad[0]));
400 6391 acydburn
                                        $replace = preg_replace('/(?<!\\\\)\$([0-9]+)/e', "'\${' . (\$1 + \$pad) . '}'", $replace);
401 5310 acydburn
                                        $pad = $repad;
402 5310 acydburn
                                }
403 5310 acydburn
404 5310 acydburn
                                // Obtain pattern modifiers to use and alter the regex accordingly
405 5310 acydburn
                                $regex = preg_replace('/!(.*)!([a-z]*)/', '$1', $match);
406 5310 acydburn
                                $regex_modifiers = preg_replace('/!(.*)!([a-z]*)/', '$2', $match);
407 5310 acydburn
408 5310 acydburn
                                for ($i = 0, $size = strlen($regex_modifiers); $i < $size; ++$i)
409 5310 acydburn
                                {
410 5310 acydburn
                                        if (strpos($modifiers, $regex_modifiers[$i]) === false)
411 5310 acydburn
                                        {
412 5310 acydburn
                                                $modifiers .= $regex_modifiers[$i];
413 5310 acydburn
414 5310 acydburn
                                                if ($regex_modifiers[$i] == 'e')
415 5310 acydburn
                                                {
416 5310 acydburn
                                                        $fp_replace = "'" . str_replace("'", "\\'", $fp_replace) . "'";
417 5310 acydburn
                                                }
418 5310 acydburn
                                        }
419 5310 acydburn
420 5310 acydburn
                                        if ($regex_modifiers[$i] == 'e')
421 5310 acydburn
                                        {
422 5310 acydburn
                                                $replace = "'.$replace.'";
423 5310 acydburn
                                        }
424 5310 acydburn
                                }
425 5310 acydburn
426 5310 acydburn
                                $fp_match = str_replace(preg_quote($token, '!'), $regex, $fp_match);
427 5310 acydburn
                                $fp_replace = str_replace($token, $replace, $fp_replace);
428 5310 acydburn
429 8153 naderman
                                $sp_match = str_replace(preg_quote($token, '!'), $sp_tokens[$token_type], $sp_match);
430 6391 acydburn
                                $sp_replace = str_replace($token, '${' . ($n + 1) . '}', $sp_replace);
431 5310 acydburn
                        }
432 5310 acydburn
433 5310 acydburn
                        $fp_match = '!' . $fp_match . '!' . $modifiers;
434 10542 Kellanved
                        $sp_match = '!' . $sp_match . '!s' . (($utf8) ? 'u' : '');
435 5310 acydburn
436 5310 acydburn
                        if (strpos($fp_match, 'e') !== false)
437 5310 acydburn
                        {
438 5310 acydburn
                                $fp_replace = str_replace("'.'", '', $fp_replace);
439 5310 acydburn
                                $fp_replace = str_replace(".''.", '.', $fp_replace);
440 5310 acydburn
                        }
441 5310 acydburn
                }
442 5310 acydburn
                else
443 5310 acydburn
                {
444 5310 acydburn
                        // No replacement is present, no need for a second-pass pattern replacement
445 5310 acydburn
                        // A simple str_replace will suffice
446 5310 acydburn
                        $fp_match = '!' . $fp_match . '!' . $modifiers;
447 5310 acydburn
                        $sp_match = $fp_replace;
448 5310 acydburn
                        $sp_replace = '';
449 5310 acydburn
                }
450 5310 acydburn
451 5310 acydburn
                // Lowercase tags
452 6133 davidmj
                $bbcode_tag = preg_replace('/.*?\[([a-z0-9_-]+=?).*/i', '$1', $bbcode_match);
453 7768 davidmj
                $bbcode_search = preg_replace('/.*?\[([a-z0-9_-]+)=?.*/i', '$1', $bbcode_match);
454 7663 davidmj
455 7663 davidmj
                if (!preg_match('/^[a-zA-Z0-9_-]+=?$/', $bbcode_tag))
456 7663 davidmj
                {
457 7663 davidmj
                        global $user;
458 7663 davidmj
                        trigger_error($user->lang['BBCODE_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
459 7663 davidmj
                }
460 7663 davidmj
461 7768 davidmj
                $fp_match = preg_replace('#\[/?' . $bbcode_search . '#ie', "strtolower('\$0')", $fp_match);
462 7768 davidmj
                $fp_replace = preg_replace('#\[/?' . $bbcode_search . '#ie', "strtolower('\$0')", $fp_replace);
463 7768 davidmj
                $sp_match = preg_replace('#\[/?' . $bbcode_search . '#ie', "strtolower('\$0')", $sp_match);
464 7768 davidmj
                $sp_replace = preg_replace('#\[/?' . $bbcode_search . '#ie', "strtolower('\$0')", $sp_replace);
465 5310 acydburn
466 5310 acydburn
                return array(
467 5310 acydburn
                        'bbcode_tag'                                => $bbcode_tag,
468 5310 acydburn
                        'first_pass_match'                        => $fp_match,
469 5310 acydburn
                        'first_pass_replace'                => $fp_replace,
470 5310 acydburn
                        'second_pass_match'                        => $sp_match,
471 5310 acydburn
                        'second_pass_replace'                => $sp_replace
472 5310 acydburn
                );
473 5310 acydburn
        }
474 5310 acydburn
}
475 5310 acydburn
476 5310 acydburn
?>