1<?php 2/************************************************************************************* 3 * mysql.php 4 * --------- 5 * Author: Marjolein Katsma (marjolein.is.back@gmail.com) 6 * Copyright: (c) 2008 Marjolein Katsma (http://blog.marjoleinkatsma.com/) 7 * Release Version: 1.0.8.4 8 * Date Started: 2008-12-12 9 * 10 * MySQL language file for GeSHi. 11 * 12 * Based on original MySQL language file by Carl Fürstenberg (2004); brought 13 * up-to-date for current MySQL versions, and with more classes for different 14 * types of keywords; several minor errors were corrected as well. 15 * 16 * Some "classes" have two groups here: this is to allow for the fact that some 17 * keywords in MySQL have a double function: many of those are either a function 18 * (must be immediately followed by an opening bracket) or some other keyword: 19 * so they can be distinguished by the presence (or not) of that opening bracket. 20 * (An immediately following opening bracket is a default rule for functions in 21 * MySQL, though this may be overridden; because it's only a default, we use a 22 * regex lookahead only where necessary to distinguish homonyms, not generally 23 * to match any function.) 24 * Other keywords with double usage cannot be distinguished and are classified 25 * in the "Mix" category. 26 * 27 ************************************************************************************* 28 * 29 * This file is part of GeSHi. 30 * 31 * GeSHi is free software; you can redistribute it and/or modify 32 * it under the terms of the GNU General Public License as published by 33 * the Free Software Foundation; either version 2 of the License, or 34 * (at your option) any later version. 35 * 36 * GeSHi is distributed in the hope that it will be useful, 37 * but WITHOUT ANY WARRANTY; without even the implied warranty of 38 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 39 * GNU General Public License for more details. 40 * 41 * You should have received a copy of the GNU General Public License 42 * along with GeSHi; if not, write to the Free Software 43 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 44 * 45 ************************************************************************************/ 46 47$language_data = array ( 48 'LANG_NAME' => 'MySQL', 49 //'COMMENT_SINGLE' => array(1 =>'--', 2 => '#'), // '--' MUST be folowed by whitespace,not necessarily a space 50 'COMMENT_SINGLE' => array( 51 1 =>'-- ', 52 2 => '#' 53 ), 54 'COMMENT_REGEXP' => array( 55 1 => "/(?:--\s).*?$/", // double dash followed by any whitespace 56 ), 57 'COMMENT_MULTI' => array('/*' => '*/'), 58 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE, // @@@ would be nice if this could be defined per group! 59 'QUOTEMARKS' => array("'", '"', '`'), 60 'ESCAPE_CHAR' => '\\', // by default only, can be specified 61 'ESCAPE_REGEXP' => array( 62 1 => "/[_%]/", // search wildcards 63 ), 64 'NUMBERS' => 65 GESHI_NUMBER_INT_BASIC | 66 GESHI_NUMBER_OCT_PREFIX | 67 GESHI_NUMBER_HEX_PREFIX | 68 GESHI_NUMBER_FLT_NONSCI | 69 GESHI_NUMBER_FLT_SCI_SHORT | 70 GESHI_NUMBER_FLT_SCI_ZERO, 71 'KEYWORDS' => array( 72 1 => array( 73 // Mix: statement keywords and keywords that don't fit in any other 74 // category, or have multiple usage/meanings 75 'ACTION','ADD','AFTER','ALGORITHM','ALL','ALTER','ANALYZE','ANY', 76 'ASC','AS','BDB','BEGIN','BERKELEYDB','BINARY','BTREE','CALL', 77 'CASCADED','CASCADE','CHAIN','CHECK','COLUMNS','COLUMN','COMMENT', 78 'COMMIT','COMMITTED','CONSTRAINT','CONTAINS SQL','CONSISTENT', 79 'CONVERT','CREATE','CROSS','DATA','DATABASES', 80 'DECLARE','DEFINER','DELAYED','DELETE','DESCRIBE','DESC', 81 'DETERMINISTIC','DISABLE','DISCARD','DISTINCTROW','DISTINCT','DO', 82 'DROP','DUMPFILE','DUPLICATE KEY','ENABLE','ENCLOSED BY','ENGINE', 83 'ERRORS','ESCAPED BY','EXISTS','EXPLAIN','EXTENDED','FIELDS', 84 'FIRST','FOR EACH ROW','FORCE','FOREIGN KEY','FROM','FULL', 85 'FUNCTION','GLOBAL','GRANT','GROUP BY','HANDLER','HASH','HAVING', 86 'HELP','HIGH_PRIORITY','IF NOT EXISTS','IGNORE','IMPORT','INDEX', 87 'INFILE','INNER','INNODB','INOUT','INTO','INVOKER', 88 'ISOLATION LEVEL','JOIN','KEYS','KEY','KILL','LANGUAGE SQL','LAST', 89 'LIMIT','LINES','LOAD','LOCAL','LOCK','LOW_PRIORITY', 90 'MASTER_SERVER_ID','MATCH','MERGE','MIDDLEINT','MODIFIES SQL DATA', 91 'MODIFY','MRG_MYISAM','NATURAL','NEXT','NO SQL','NO','ON', 92 'OPTIMIZE','OPTIONALLY','OPTION','ORDER BY','OUTER','OUTFILE','OUT', 93 'PARTIAL','PREV','PRIMARY KEY','PRIVILEGES','PROCEDURE','PURGE', 94 'QUICK','READS SQL DATA','READ','REFERENCES','RELEASE','RENAME', 95 'REPEATABLE','REQUIRE','RESTRICT','RETURNS','REVOKE', 96 'ROLLBACK','ROUTINE','RTREE','SAVEPOINT','SELECT', 97 'SERIALIZABLE','SESSION','SET','SHARE MODE','SHOW','SIMPLE', 98 'SNAPSHOT','SOME','SONAME','SQL SECURITY','SQL_BIG_RESULT', 99 'SQL_BUFFER_RESULT','SQL_CACHE','SQL_CALC_FOUND_ROWS', 100 'SQL_NO_CACHE','SQL_SMALL_RESULT','SSL','START','STARTING BY', 101 'STATUS','STRAIGHT_JOIN','STRIPED','TABLESPACE','TABLES','TABLE', 102 'TEMPORARY','TEMPTABLE','TERMINATED BY','TO','TRANSACTIONS', 103 'TRANSACTION','TRIGGER','TYPES','TYPE','UNCOMMITTED','UNDEFINED', 104 'UNION','UNLOCK_TABLES','UPDATE','USAGE','USE','USER_RESOURCES', 105 'USING','VALUES','VALUE','VIEW','WARNINGS','WHERE','WITH ROLLUP', 106 'WITH','WORK','WRITE', 107 ), 108 2 => array( //No ( must follow 109 // Mix: statement keywords distinguished from functions by the same name 110 "CURRENT_USER", "DATABASE", "IN", "INSERT", "DEFAULT", "REPLACE", "SCHEMA", "TRUNCATE" 111 ), 112 3 => array( 113 // Values (Constants) 114 'FALSE','NULL','TRUE', 115 ), 116 4 => array( 117 // Column Data Types 118 'BIGINT','BIT','BLOB','BOOLEAN','BOOL','CHARACTER VARYING', 119 'CHAR VARYING','DATETIME','DECIMAL','DEC','DOUBLE PRECISION', 120 'DOUBLE','ENUM','FIXED','FLOAT','GEOMETRYCOLLECTION','GEOMETRY', 121 'INTEGER','INT','LINESTRING','LONGBLOB','LONGTEXT','MEDIUMBLOB', 122 'MEDIUMINT','MEDIUMTEXT','MULTIPOINT','MULTILINESTRING', 123 'MULTIPOLYGON','NATIONAL CHARACTER','NATIONAL CHARACTER VARYING', 124 'NATIONAL CHAR VARYING','NATIONAL VARCHAR','NCHAR VARCHAR','NCHAR', 125 'NUMERIC','POINT','POLYGON','REAL','SERIAL', 126 'SMALLINT','TEXT','TIMESTAMP','TINYBLOB','TINYINT', 127 'TINYTEXT','VARBINARY','VARCHARACTER','VARCHAR', 128 ), 129 5 => array( //No ( must follow 130 // Column data types distinguished from functions by the same name 131 "CHAR", "DATE", "TIME" 132 ), 133 6 => array( 134 // Table, Column & Index Attributes 135 'AUTO_INCREMENT','AVG_ROW_LENGTH','BOTH','CHECKSUM','CONNECTION', 136 'DATA DIRECTORY','DEFAULT NULL','DELAY_KEY_WRITE','FULLTEXT', 137 'INDEX DIRECTORY','INSERT_METHOD','LEADING','MAX_ROWS','MIN_ROWS', 138 'NOT NULL','PACK_KEYS','ROW_FORMAT','SERIAL DEFAULT VALUE','SIGNED', 139 'SPATIAL','TRAILING','UNIQUE','UNSIGNED','ZEROFILL' 140 ), 141 7 => array( //No ( must follow 142 // Column attribute distinguished from function by the same name 143 "CHARSET" 144 ), 145 8 => array( 146 // Date and Time Unit Specifiers 147 'DAY_HOUR','DAY_MICROSECOND','DAY_MINUTE','DAY_SECOND', 148 'HOUR_MICROSECOND','HOUR_MINUTE','HOUR_SECOND', 149 'MINUTE_MICROSECOND','MINUTE_SECOND', 150 'SECOND_MICROSECOND','YEAR_MONTH' 151 ), 152 9 => array( //No ( must follow 153 // Date-time unit specifiers distinguished from functions by the same name 154 "DAY", "HOUR", "MICROSECOND", "MINUTE", "MONTH", "QUARTER", "SECOND", "WEEK", "YEAR" 155 ), 156 10 => array( 157 // Operators (see also Symbols) 158 'AND','BETWEEN','CHARACTER SET','COLLATE','DIV','IS NOT NULL', 159 'IS NOT','IS NULL','IS','LIKE','NOT','OFFSET','OR','REGEXP','RLIKE', 160 'SOUNDS LIKE','XOR' 161 ), 162 11 => array( //No ( must follow 163 // Operator distinghuished from function by the same name 164 "INTERVAL" 165 ), 166 12 => array( 167 // Control Flow (functions) 168 'CASE','ELSE','END','IFNULL','IF','NULLIF','THEN','WHEN', 169 ), 170 13 => array( 171 // String Functions 172 'ASCII','BIN','BIT_LENGTH','CHAR_LENGTH','CHARACTER_LENGTH', 173 'CONCAT_WS','CONCAT','ELT','EXPORT_SET','FIELD', 174 'FIND_IN_SET','FORMAT','HEX','INSTR','LCASE','LEFT','LENGTH', 175 'LOAD_FILE','LOCATE','LOWER','LPAD','LTRIM','MAKE_SET','MID', 176 'OCTET_LENGTH','ORD','POSITION','QUOTE','REPEAT','REVERSE', 177 'RIGHT','RPAD','RTRIM','SOUNDEX','SPACE','STRCMP','SUBSTRING_INDEX', 178 'SUBSTRING','TRIM','UCASE','UNHEX','UPPER', 179 ), 180 14 => array( //A ( must follow 181 // String functions distinguished from other keywords by the same name 182 "INSERT", "REPLACE", "CHAR" 183 ), 184 15 => array( 185 // Numeric Functions 186 'ABS','ACOS','ASIN','ATAN2','ATAN','CEILING','CEIL', 187 'CONV','COS','COT','CRC32','DEGREES','EXP','FLOOR','LN','LOG10', 188 'LOG2','LOG','MOD','OCT','PI','POWER','POW','RADIANS','RAND', 189 'ROUND','SIGN','SIN','SQRT','TAN', 190 ), 191 16 => array( //A ( must follow 192 // Numeric function distinguished from other keyword by the same name 193 "TRUNCATE" 194 ), 195 17 => array( 196 // Date and Time Functions 197 'ADDDATE','ADDTIME','CONVERT_TZ','CURDATE','CURRENT_DATE', 198 'CURRENT_TIME','CURRENT_TIMESTAMP','CURTIME','DATE_ADD', 199 'DATE_FORMAT','DATE_SUB','DATEDIFF','DAYNAME','DAYOFMONTH', 200 'DAYOFWEEK','DAYOFYEAR','EXTRACT','FROM_DAYS','FROM_UNIXTIME', 201 'GET_FORMAT','LAST_DAY','LOCALTIME','LOCALTIMESTAMP','MAKEDATE', 202 'MAKETIME','MONTHNAME','NOW','PERIOD_ADD', 203 'PERIOD_DIFF','SEC_TO_TIME','STR_TO_DATE','SUBDATE','SUBTIME', 204 'SYSDATE','TIME_FORMAT','TIME_TO_SEC', 205 'TIMESTAMPADD','TIMESTAMPDIFF','TO_DAYS', 206 'UNIX_TIMESTAMP','UTC_DATE','UTC_TIME','UTC_TIMESTAMP','WEEKDAY', 207 'WEEKOFYEAR','YEARWEEK', 208 ), 209 18 => array( //A ( must follow 210 // Date-time functions distinguished from other keywords by the same name 211 "DATE", "DAY", "HOUR", "MICROSECOND", "MINUTE", "MONTH", "QUARTER", 212 "SECOND", "TIME", "WEEK", "YEAR" 213 ), 214 19 => array( 215 // Comparison Functions 216 'COALESCE','GREATEST','ISNULL','LEAST', 217 ), 218 20 => array( //A ( must follow 219 // Comparison functions distinguished from other keywords by the same name 220 "IN", "INTERVAL" 221 ), 222 21 => array( 223 // Encryption and Compression Functions 224 'AES_DECRYPT','AES_ENCRYPT','COMPRESS','DECODE','DES_DECRYPT', 225 'DES_ENCRYPT','ENCODE','ENCRYPT','MD5','OLD_PASSWORD','PASSWORD', 226 'SHA1','SHA','UNCOMPRESS','UNCOMPRESSED_LENGTH', 227 ), 228 22 => array( 229 // GROUP BY (aggregate) Functions 230 'AVG','BIT_AND','BIT_OR','BIT_XOR','COUNT','GROUP_CONCAT', 231 'MAX','MIN','STDDEV_POP','STDDEV_SAMP','STDDEV','STD','SUM', 232 'VAR_POP','VAR_SAMP','VARIANCE', 233 ), 234 23 => array( 235 // Information Functions 236 'BENCHMARK','COERCIBILITY','COLLATION','CONNECTION_ID', 237 'FOUND_ROWS','LAST_INSERT_ID','ROW_COUNT', 238 'SESSION_USER','SYSTEM_USER','USER','VERSION', 239 ), 240 24 => array( //A ( must follow 241 // Information functions distinguished from other keywords by the same name 242 "CURRENT_USER", "DATABASE", "SCHEMA", "CHARSET" 243 ), 244 25 => array( 245 // Miscellaneous Functions 246 'ExtractValue','BIT_COUNT','GET_LOCK','INET_ATON','INET_NTOA', 247 'IS_FREE_LOCK','IS_USED_LOCK','MASTER_POS_WAIT','NAME_CONST', 248 'RELEASE_LOCK','SLEEP','UpdateXML','UUID', 249 ), 250 26 => array( //A ( must follow 251 // Miscellaneous function distinguished from other keyword by the same name 252 "DEFAULT" 253 ), 254 27 => array( 255 // Geometry Functions 256 'Area','AsBinary','AsText','AsWKB','AsWKT','Boundary','Buffer', 257 'Centroid','Contains','ConvexHull','Crosses', 258 'Difference','Dimension','Disjoint','Distance', 259 'EndPoint','Envelope','Equals','ExteriorRing', 260 'GLength','GeomCollFromText','GeomCollFromWKB','GeomFromText', 261 'GeomFromWKB','GeometryCollectionFromText', 262 'GeometryCollectionFromWKB','GeometryFromText','GeometryFromWKB', 263 'GeometryN','GeometryType', 264 'InteriorRingN','Intersection','Intersects','IsClosed','IsEmpty', 265 'IsRing','IsSimple', 266 'LineFromText','LineFromWKB','LineStringFromText', 267 'LineStringFromWKB', 268 'MBRContains','MBRDisjoint','MBREqual','MBRIntersects', 269 'MBROverlaps','MBRTouches','MBRWithin','MLineFromText', 270 'MLineFromWKB','MPointFromText','MPointFromWKB','MPolyFromText', 271 'MPolyFromWKB','MultiLineStringFromText','MultiLineStringFromWKB', 272 'MultiPointFromText','MultiPointFromWKB','MultiPolygonFromText', 273 'MultiPolygonFromWKB', 274 'NumGeometries','NumInteriorRings','NumPoints', 275 'Overlaps', 276 'PointFromText','PointFromWKB','PointN','PointOnSurface', 277 'PolyFromText','PolyFromWKB','PolygonFromText','PolygonFromWKB', 278 'Related','SRID','StartPoint','SymDifference', 279 'Touches', 280 'Union', 281 'Within', 282 'X', 283 'Y', 284 ), 285 ), 286 'SYMBOLS' => array( 287 1 => array( 288 /* Operators */ 289 '=', ':=', // assignment operators 290 '||', '&&', '!', // locical operators 291 '=', '<=>', '>=', '>', '<=', '<', '<>', '!=', // comparison operators 292 '|', '&', '^', '~', '<<', '>>', // bitwise operators 293 '-', '+', '*', '/', '%', // numerical operators 294 ), 295 2 => array( 296 /* Other syntactical symbols */ 297 '(', ')', 298 ',', ';', 299 ), 300 ), 301 'CASE_SENSITIVE' => array( 302 GESHI_COMMENTS => false, 303 1 => false, 304 2 => false, 305 3 => false, 306 4 => false, 307 5 => false, 308 6 => false, 309 7 => false, 310 8 => false, 311 9 => false, 312 10 => false, 313 11 => false, 314 12 => false, 315 13 => false, 316 13 => false, 317 14 => false, 318 15 => false, 319 16 => false, 320 17 => false, 321 18 => false, 322 19 => false, 323 20 => false, 324 21 => false, 325 22 => false, 326 23 => false, 327 24 => false, 328 25 => false, 329 26 => false, 330 27 => false, 331 ), 332 'STYLES' => array( 333 'KEYWORDS' => array( 334 1 => 'color: #990099; font-weight: bold;', // mix 335 2 => 'color: #990099; font-weight: bold;', // mix 336 3 => 'color: #9900FF; font-weight: bold;', // constants 337 4 => 'color: #999900; font-weight: bold;', // column data types 338 5 => 'color: #999900; font-weight: bold;', // column data types 339 6 => 'color: #FF9900; font-weight: bold;', // attributes 340 7 => 'color: #FF9900; font-weight: bold;', // attributes 341 8 => 'color: #9900FF; font-weight: bold;', // date-time units 342 9 => 'color: #9900FF; font-weight: bold;', // date-time units 343 344 10 => 'color: #CC0099; font-weight: bold;', // operators 345 11 => 'color: #CC0099; font-weight: bold;', // operators 346 347 12 => 'color: #009900;', // control flow (functions) 348 13 => 'color: #000099;', // string functions 349 14 => 'color: #000099;', // string functions 350 15 => 'color: #000099;', // numeric functions 351 16 => 'color: #000099;', // numeric functions 352 17 => 'color: #000099;', // date-time functions 353 18 => 'color: #000099;', // date-time functions 354 19 => 'color: #000099;', // comparison functions 355 20 => 'color: #000099;', // comparison functions 356 21 => 'color: #000099;', // encryption functions 357 22 => 'color: #000099;', // aggregate functions 358 23 => 'color: #000099;', // information functions 359 24 => 'color: #000099;', // information functions 360 25 => 'color: #000099;', // miscellaneous functions 361 26 => 'color: #000099;', // miscellaneous functions 362 27 => 'color: #00CC00;', // geometry functions 363 ), 364 'COMMENTS' => array( 365 'MULTI' => 'color: #808000; font-style: italic;', 366 1 => 'color: #808080; font-style: italic;', 367 2 => 'color: #808080; font-style: italic;' 368 ), 369 'ESCAPE_CHAR' => array( 370 0 => 'color: #004000; font-weight: bold;', 371 1 => 'color: #008080; font-weight: bold;' // search wildcards 372 ), 373 'BRACKETS' => array( 374 0 => 'color: #FF00FF;' 375 ), 376 'STRINGS' => array( 377 0 => 'color: #008000;' 378 ), 379 'NUMBERS' => array( 380 0 => 'color: #008080;' 381 ), 382 'METHODS' => array( 383 ), 384 'SYMBOLS' => array( 385 1 => 'color: #CC0099;', // operators 386 2 => 'color: #000033;', // syntax 387 ), 388 'SCRIPT' => array( 389 ), 390 'REGEXPS' => array( 391 ) 392 ), 393 'URLS' => array( 394 1 => 'http://search.mysql.com/search?site=refman-51&q={FNAME}&lr=lang_en', 395 2 => 'http://search.mysql.com/search?site=refman-51&q={FNAME}&lr=lang_en', 396 3 => 'http://search.mysql.com/search?site=refman-51&q={FNAME}&lr=lang_en', 397 4 => 'http://search.mysql.com/search?site=refman-51&q={FNAME}&lr=lang_en', 398 5 => 'http://search.mysql.com/search?site=refman-51&q={FNAME}&lr=lang_en', 399 6 => 'http://search.mysql.com/search?site=refman-51&q={FNAME}&lr=lang_en', 400 7 => 'http://search.mysql.com/search?site=refman-51&q={FNAME}&lr=lang_en', 401 8 => 'http://search.mysql.com/search?site=refman-51&q={FNAME}&lr=lang_en', 402 9 => 'http://search.mysql.com/search?site=refman-51&q={FNAME}&lr=lang_en', 403 404 10 => 'http://dev.mysql.com/doc/refman/5.1/en/non-typed-operators.html', 405 11 => 'http://dev.mysql.com/doc/refman/5.1/en/non-typed-operators.html', 406 407 12 => 'http://dev.mysql.com/doc/refman/5.1/en/control-flow-functions.html', 408 13 => 'http://dev.mysql.com/doc/refman/5.1/en/string-functions.html', 409 14 => 'http://dev.mysql.com/doc/refman/5.1/en/string-functions.html', 410 15 => 'http://dev.mysql.com/doc/refman/5.1/en/numeric-functions.html', 411 16 => 'http://dev.mysql.com/doc/refman/5.1/en/numeric-functions.html', 412 17 => 'http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html', 413 18 => 'http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html', 414 19 => 'http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html', 415 20 => 'http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html', 416 21 => 'http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html', 417 22 => 'http://dev.mysql.com/doc/refman/5.1/en/group-by-functions-and-modifiers.html', 418 23 => 'http://dev.mysql.com/doc/refman/5.1/en/information-functions.html', 419 24 => 'http://dev.mysql.com/doc/refman/5.1/en/information-functions.html', 420 25 => 'http://dev.mysql.com/doc/refman/5.1/en/func-op-summary-ref.html', 421 26 => 'http://dev.mysql.com/doc/refman/5.1/en/func-op-summary-ref.html', 422 27 => 'http://dev.mysql.com/doc/refman/5.1/en/analysing-spatial-information.html', 423 ), 424 'OOLANG' => false, 425 'OBJECT_SPLITTERS' => array( 426 ), 427 'REGEXPS' => array( 428 ), 429 'STRICT_MODE_APPLIES' => GESHI_NEVER, 430 'SCRIPT_DELIMITERS' => array( 431 ), 432 'HIGHLIGHT_STRICT_BLOCK' => array( 433 ), 434 'TAB_WIDTH' => 4, 435 'PARSER_CONTROL' => array( 436 'KEYWORDS' => array( 437 2 => array( 438 'DISALLOWED_AFTER' => '(?![\(\w])' 439 ), 440 5 => array( 441 'DISALLOWED_AFTER' => '(?![\(\w])' 442 ), 443 7 => array( 444 'DISALLOWED_AFTER' => '(?![\(\w])' 445 ), 446 9 => array( 447 'DISALLOWED_AFTER' => '(?![\(\w])' 448 ), 449 11 => array( 450 'DISALLOWED_AFTER' => '(?![\(\w])' 451 ), 452 453 14 => array( 454 'DISALLOWED_AFTER' => '(?=\()' 455 ), 456 16 => array( 457 'DISALLOWED_AFTER' => '(?=\()' 458 ), 459 18 => array( 460 'DISALLOWED_AFTER' => '(?=\()' 461 ), 462 20 => array( 463 'DISALLOWED_AFTER' => '(?=\()' 464 ), 465 24 => array( 466 'DISALLOWED_AFTER' => '(?=\()' 467 ), 468 26 => array( 469 'DISALLOWED_AFTER' => '(?=\()' 470 ) 471 ) 472 ) 473); 474 475?> 476