3v4l.org

run code in 300+ PHP versions simultaneously
<?php function acceptOne($a) {}; $words = ['ACCESSIBLE', 'ACTION', 'AFTER', 'AGAINST', 'AGGREGATE', 'ALGORITHM', 'ALL', 'ALTER', 'ANALYSE', 'ANALYZE', 'AS', 'ASC', 'AUTOCOMMIT', 'AUTO_INCREMENT', 'BACKUP', 'BEGIN', 'BETWEEN', 'BINLOG', 'BOTH', 'CASCADE', 'CASE', 'CHANGE', 'CHANGED', 'CHARACTER', 'CHARSET', 'CHECK', 'CHECKSUM', 'COLLATE', 'COLLATION', 'COLUMN', 'COLUMNS', 'COMMENT', 'COMMIT', 'COMMITTED', 'COMPRESSED', 'CONCURRENT', 'CONSTRAINT', 'CONTAINS', 'CONVERT', 'CREATE', 'CROSS', 'CURRENT', 'CURRENT_TIMESTAMP', 'DATABASE', 'DATABASES', 'DAY', 'DAY_HOUR', 'DAY_MINUTE', 'DAY_SECOND', 'DEFAULT', 'DEFINER', 'DELAYED', 'DELETE', 'DESC', 'DESCRIBE', 'DETERMINISTIC', 'DISTINCT', 'DISTINCTROW', 'DIV', 'DO', 'DUMPFILE', 'DUPLICATE', 'DYNAMIC', 'ELSE', 'ENCLOSED', 'END', 'ENGINE', 'ENGINES', 'ENGINE_TYPE', 'ESCAPE', 'ESCAPED', 'EVENTS', 'EXEC', 'EXECUTE', 'EXISTS', 'EXPLAIN', 'EXTENDED', 'FAST', 'FETCH', 'FIELDS', 'FILE', 'FILTER', 'FIRST', 'FIXED', 'FLUSH', 'FOLLOWING', 'FOR', 'FORCE', 'FOREIGN', 'FULL', 'FULLTEXT', 'FUNCTION', 'GLOBAL', 'GRANT', 'GRANTS', 'GROUP', 'GROUPS', 'HEAP', 'HIGH_PRIORITY', 'HOSTS', 'HOUR', 'HOUR_MINUTE', 'HOUR_SECOND', 'IDENTIFIED', 'IF', 'IFNULL', 'IGNORE', 'IN', 'INDEX', 'INDEXES', 'INFILE', 'INSERT', 'INSERT_ID', 'INSERT_METHOD', 'INTERVAL', 'INTO', 'INVOKER', 'IS', 'ISOLATION', 'KEY', 'KEYS', 'KILL', 'LAST_INSERT_ID', 'LEADING', 'LEVEL', 'LIKE', 'LINEAR', 'LINES', 'LOAD', 'LOCAL', 'LOCK', 'LOCKS', 'LOGS', 'LOW_PRIORITY', 'MARIA', 'MASTER', 'MASTER_CONNECT_RETRY', 'MASTER_HOST', 'MASTER_LOG_FILE', 'MATCH', 'MAX_CONNECTIONS_PER_HOUR', 'MAX_QUERIES_PER_HOUR', 'MAX_ROWS', 'MAX_UPDATES_PER_HOUR', 'MAX_USER_CONNECTIONS', 'MEDIUM', 'MERGE', 'MINUTE', 'MINUTE_SECOND', 'MIN_ROWS', 'MODE', 'MONTH', 'MRG_MYISAM', 'MYISAM', 'NAMES', 'NATURAL', 'NOT', 'NULL', 'OFFSET', 'ON', 'OPEN', 'OPTIMIZE', 'OPTION', 'OPTIONALLY', 'OUTFILE', 'OVER', 'PACK_KEYS', 'PAGE', 'PARTIAL', 'PARTITION', 'PARTITIONS', 'PASSWORD', 'PRECEDING', 'PRIMARY', 'PRIVILEGES', 'PROCEDURE', 'PROCESS', 'PROCESSLIST', 'PURGE', 'QUICK', 'RAID0', 'RAID_CHUNKS', 'RAID_CHUNKSIZE', 'RAID_TYPE', 'RANGE', 'READ', 'READ_ONLY', 'READ_WRITE', 'RECURSIVE', 'REFERENCES', 'REGEXP', 'RELOAD', 'RENAME', 'REPAIR', 'REPEATABLE', 'REPLACE', 'REPLICATION', 'RESET', 'RESTORE', 'RESTRICT', 'RETURN', 'RETURNS', 'REVOKE', 'RLIKE', 'ROLLBACK', 'ROW', 'ROWS', 'ROW_FORMAT', 'SECOND', 'SECURITY', 'SEPARATOR', 'SERIALIZABLE', 'SESSION', 'SET', 'SHARE', 'SHOW', 'SHUTDOWN', 'SLAVE', 'SONAME', 'SOUNDS', 'SQL', 'SQL_AUTO_IS_NULL', 'SQL_BIG_RESULT', 'SQL_BIG_SELECTS', 'SQL_BIG_TABLES', 'SQL_BUFFER_RESULT', 'SQL_CACHE', 'SQL_CALC_FOUND_ROWS', 'SQL_LOG_BIN', 'SQL_LOG_OFF', 'SQL_LOG_UPDATE', 'SQL_LOW_PRIORITY_UPDATES', 'SQL_MAX_JOIN_SIZE', 'SQL_NO_CACHE', 'SQL_QUOTE_SHOW_CREATE', 'SQL_SAFE_UPDATES', 'SQL_SELECT_LIMIT', 'SQL_SLAVE_SKIP_COUNTER', 'SQL_SMALL_RESULT', 'SQL_WARNINGS', 'START', 'STARTING', 'STATUS', 'STOP', 'STORAGE', 'STRAIGHT_JOIN', 'STRING', 'STRIPED', 'SUPER', 'TABLE', 'TABLES', 'TEMPORARY', 'TERMINATED', 'THEN', 'TIES', 'TO', 'TRAILING', 'TRANSACTIONAL', 'TRUE', 'TRUNCATE', 'TYPE', 'TYPES', 'UNBOUNDED', 'UNCOMMITTED', 'UNIQUE', 'UNLOCK', 'UNSIGNED', 'USAGE', 'USE', 'USING', 'VARIABLES', 'VIEW', 'WHEN', 'WITH', 'WORK', 'WRITE', 'YEAR_MONTH']; $regexDummy = '/' . makeRegexFromListDummy($words) . '/'; $regexOptimized = '/' . makeRegexFromListOptimized($words) . '/'; $regexDummyWithS = '/' . makeRegexFromListDummy($words) . '/S'; var_dump($regexDummy); var_dump($regexOptimized); $testStr = 'BLOB'; $benchFx = function (string $msg, \Closure $fx) { $times = []; for ($i = 0; $i < 100; $i++) { $t = microtime(true); $fx(); $t = microtime(true) - $t; $times[] = $t; } $bestTime = min($times); echo $msg . ': ' . round($bestTime * 1000, 2) . " ms\n"; }; $benchFx('dummy', function () { global $regexDummy, $testStr; for ($i = 0; $i < 5_000; $i++) { preg_match($regexDummy, $testStr . $i, $matches); acceptOne($matches); } }); $benchFx('optimized', function () { global $regexOptimized, $testStr; for ($i = 0; $i < 5_000; $i++) { preg_match($regexOptimized, $testStr . $i, $matches); acceptOne($matches); } }); $benchFx('dummy /w S', function () { global $regexDummyWithS, $testStr; for ($i = 0; $i < 5_000; $i++) { preg_match($regexDummyWithS, $testStr . $i, $matches); acceptOne($matches); } }); function makeRegexFromListDummy(array $values): string { // sort list by alphabet and from longest word to shortest usort($values, static function (string $a, string $b) { return str_starts_with($a, $b) || str_starts_with($b, $a) ? strlen($b) <=> strlen($a) : $a <=> $b; }); $regex = '(?>'; foreach ($values as $v) { if ($regex !== '(?>') { $regex .= '|'; } $regex .= preg_quote($v, '/'); } return $regex . ')'; } function makeRegexFromListOptimized(array $values, bool $sorted = false): string { // sort list by alphabet and from longest word to shortest if (! $sorted) { usort($values, static function (string $a, string $b) { return str_starts_with($a, $b) || str_starts_with($b, $a) ? strlen($b) <=> strlen($a) : $a <=> $b; }); } /** @var array<int|string, list<string>> $valuesBySharedPrefix */ $valuesBySharedPrefix = []; $items = []; $prefix = null; foreach ($values as $v) { if ($prefix !== null && ! str_starts_with($v, substr($prefix, 0, 1))) { $valuesBySharedPrefix[$prefix] = $items; $items = []; $prefix = null; } $items[] = $v; if ($prefix === null) { $prefix = $v; } else { while (! str_starts_with($v, $prefix)) { $prefix = substr($prefix, 0, -1); } } } if ($items !== []) { $valuesBySharedPrefix[$prefix] = $items; $items = []; $prefix = null; } $regex = '(?>'; foreach ($valuesBySharedPrefix as $prefix => $items) { if ($regex !== '(?>') { $regex .= '|'; } if (is_int($prefix)) { $prefix = (string) $prefix; } $regex .= preg_quote($prefix, '/'); $regex .= count($items) === 1 ? preg_quote(substr(reset($items), strlen($prefix)), '/') : makeRegexFromListOptimized(array_map(static fn ($v) => substr($v, strlen($prefix)), $items), true); } return $regex . ')'; }
Output for git.master_jit
string(2391) "/(?>ACCESSIBLE|ACTION|AFTER|AGAINST|AGGREGATE|ALGORITHM|ALL|ALTER|ANALYSE|ANALYZE|ASC|AS|AUTOCOMMIT|AUTO_INCREMENT|BACKUP|BEGIN|BETWEEN|BINLOG|BOTH|CASCADE|CASE|CHANGED|CHANGE|CHARACTER|CHARSET|CHECKSUM|CHECK|COLLATE|COLLATION|COLUMNS|COLUMN|COMMENT|COMMITTED|COMMIT|COMPRESSED|CONCURRENT|CONSTRAINT|CONTAINS|CONVERT|CREATE|CROSS|CURRENT_TIMESTAMP|CURRENT|DATABASES|DATABASE|DAY_HOUR|DAY_MINUTE|DAY_SECOND|DAY|DEFAULT|DEFINER|DELAYED|DELETE|DESCRIBE|DESC|DETERMINISTIC|DISTINCTROW|DISTINCT|DIV|DO|DUMPFILE|DUPLICATE|DYNAMIC|ELSE|ENCLOSED|END|ENGINES|ENGINE_TYPE|ENGINE|ESCAPED|ESCAPE|EVENTS|EXECUTE|EXEC|EXISTS|EXPLAIN|EXTENDED|FAST|FETCH|FIELDS|FILE|FILTER|FIRST|FIXED|FLUSH|FOLLOWING|FORCE|FOREIGN|FOR|FULLTEXT|FULL|FUNCTION|GLOBAL|GRANTS|GRANT|GROUPS|GROUP|HEAP|HIGH_PRIORITY|HOSTS|HOUR_MINUTE|HOUR_SECOND|HOUR|IDENTIFIED|IFNULL|IF|IGNORE|INDEXES|INDEX|INFILE|INSERT_ID|INSERT_METHOD|INSERT|INTERVAL|INTO|INVOKER|IN|ISOLATION|IS|KEYS|KEY|KILL|LAST_INSERT_ID|LEADING|LEVEL|LIKE|LINEAR|LINES|LOAD|LOCAL|LOCKS|LOCK|LOGS|LOW_PRIORITY|MARIA|MASTER_CONNECT_RETRY|MASTER_HOST|MASTER_LOG_FILE|MASTER|MATCH|MAX_CONNECTIONS_PER_HOUR|MAX_QUERIES_PER_HOUR|MAX_ROWS|MAX_UPDATES_PER_HOUR|MAX_USER_CONNECTIONS|MEDIUM|MERGE|MINUTE_SECOND|MINUTE|MIN_ROWS|MODE|MONTH|MRG_MYISAM|MYISAM|NAMES|NATURAL|NOT|NULL|OFFSET|ON|OPEN|OPTIMIZE|OPTIONALLY|OPTION|OUTFILE|OVER|PACK_KEYS|PAGE|PARTIAL|PARTITIONS|PARTITION|PASSWORD|PRECEDING|PRIMARY|PRIVILEGES|PROCEDURE|PROCESSLIST|PROCESS|PURGE|QUICK|RAID0|RAID_CHUNKSIZE|RAID_CHUNKS|RAID_TYPE|RANGE|READ_ONLY|READ_WRITE|READ|RECURSIVE|REFERENCES|REGEXP|RELOAD|RENAME|REPAIR|REPEATABLE|REPLACE|REPLICATION|RESET|RESTORE|RESTRICT|RETURNS|RETURN|REVOKE|RLIKE|ROLLBACK|ROWS|ROW_FORMAT|ROW|SECOND|SECURITY|SEPARATOR|SERIALIZABLE|SESSION|SET|SHARE|SHOW|SHUTDOWN|SLAVE|SONAME|SOUNDS|SQL_AUTO_IS_NULL|SQL_BIG_RESULT|SQL_BIG_SELECTS|SQL_BIG_TABLES|SQL_BUFFER_RESULT|SQL_CACHE|SQL_CALC_FOUND_ROWS|SQL_LOG_BIN|SQL_LOG_OFF|SQL_LOG_UPDATE|SQL_LOW_PRIORITY_UPDATES|SQL_MAX_JOIN_SIZE|SQL_NO_CACHE|SQL_QUOTE_SHOW_CREATE|SQL_SAFE_UPDATES|SQL_SELECT_LIMIT|SQL_SLAVE_SKIP_COUNTER|SQL_SMALL_RESULT|SQL_WARNINGS|SQL|STARTING|START|STATUS|STOP|STORAGE|STRAIGHT_JOIN|STRING|STRIPED|SUPER|TABLES|TABLE|TEMPORARY|TERMINATED|THEN|TIES|TO|TRAILING|TRANSACTIONAL|TRUE|TRUNCATE|TYPES|TYPE|UNBOUNDED|UNCOMMITTED|UNIQUE|UNLOCK|UNSIGNED|USAGE|USE|USING|VARIABLES|VIEW|WHEN|WITH|WORK|WRITE|YEAR_MONTH)/" string(2266) "/(?>A(?>C(?>CESSIBLE|TION)|FTER|G(?>AINST|GREGATE)|L(?>GORITHM|L|TER)|NALY(?>SE|ZE)|S(?>C|)|UTO(?>COMMIT|_INCREMENT))|B(?>ACKUP|E(?>GIN|TWEEN)|INLOG|OTH)|C(?>AS(?>CADE|E)|H(?>A(?>NGE(?>D|)|R(?>ACTER|SET))|ECK(?>SUM|))|O(?>L(?>LAT(?>E|ION)|UMN(?>S|))|M(?>M(?>ENT|IT(?>TED|))|PRESSED)|N(?>CURRENT|STRAINT|TAINS|VERT))|R(?>EATE|OSS)|URRENT(?>_TIMESTAMP|))|D(?>A(?>TABASE(?>S|)|Y(?>_(?>HOUR|MINUTE|SECOND)|))|E(?>F(?>AULT|INER)|L(?>AYED|ETE)|SC(?>RIBE|)|TERMINISTIC)|I(?>STINCT(?>ROW|)|V)|O|U(?>MPFILE|PLICATE)|YNAMIC)|E(?>LSE|N(?>CLOSED|D|GINE(?>S|_TYPE|))|SCAPE(?>D|)|VENTS|X(?>EC(?>UTE|)|ISTS|PLAIN|TENDED))|F(?>AST|ETCH|I(?>ELDS|L(?>E|TER)|RST|XED)|LUSH|O(?>LLOWING|R(?>CE|EIGN|))|U(?>LL(?>TEXT|)|NCTION))|G(?>LOBAL|R(?>ANT(?>S|)|OUP(?>S|)))|H(?>EAP|IGH_PRIORITY|O(?>STS|UR(?>_(?>MINUTE|SECOND)|)))|I(?>DENTIFIED|F(?>NULL|)|GNORE|N(?>DEX(?>ES|)|FILE|SERT(?>_(?>ID|METHOD)|)|T(?>ERVAL|O)|VOKER|)|S(?>OLATION|))|K(?>EY(?>S|)|ILL)|L(?>AST_INSERT_ID|E(?>ADING|VEL)|I(?>KE|NE(?>AR|S))|O(?>AD|C(?>AL|K(?>S|))|GS|W_PRIORITY))|M(?>A(?>RIA|STER(?>_(?>CONNECT_RETRY|HOST|LOG_FILE)|)|TCH|X_(?>CONNECTIONS_PER_HOUR|QUERIES_PER_HOUR|ROWS|U(?>PDATES_PER_HOUR|SER_CONNECTIONS)))|E(?>DIUM|RGE)|IN(?>UTE(?>_SECOND|)|_ROWS)|O(?>DE|NTH)|RG_MYISAM|YISAM)|N(?>A(?>MES|TURAL)|OT|ULL)|O(?>FFSET|N|P(?>EN|TI(?>MIZE|ON(?>ALLY|)))|UTFILE|VER)|P(?>A(?>CK_KEYS|GE|RTI(?>AL|TION(?>S|))|SSWORD)|R(?>ECEDING|I(?>MARY|VILEGES)|OCE(?>DURE|SS(?>LIST|)))|URGE)|QUICK|R(?>A(?>ID(?>0|_(?>CHUNKS(?>IZE|)|TYPE))|NGE)|E(?>AD(?>_(?>ONLY|WRITE)|)|CURSIVE|FERENCES|GEXP|LOAD|NAME|P(?>AIR|EATABLE|L(?>ACE|ICATION))|S(?>ET|T(?>ORE|RICT))|TURN(?>S|)|VOKE)|LIKE|O(?>LLBACK|W(?>S|_FORMAT|)))|S(?>E(?>C(?>OND|URITY)|PARATOR|RIALIZABLE|SSION|T)|H(?>ARE|OW|UTDOWN)|LAVE|O(?>NAME|UNDS)|QL(?>_(?>AUTO_IS_NULL|B(?>IG_(?>RESULT|SELECTS|TABLES)|UFFER_RESULT)|CA(?>CHE|LC_FOUND_ROWS)|LO(?>G_(?>BIN|OFF|UPDATE)|W_PRIORITY_UPDATES)|MAX_JOIN_SIZE|NO_CACHE|QUOTE_SHOW_CREATE|S(?>AFE_UPDATES|ELECT_LIMIT|LAVE_SKIP_COUNTER|MALL_RESULT)|WARNINGS)|)|T(?>A(?>RT(?>ING|)|TUS)|O(?>P|RAGE)|R(?>AIGHT_JOIN|I(?>NG|PED)))|UPER)|T(?>ABLE(?>S|)|E(?>MPORARY|RMINATED)|HEN|IES|O|R(?>A(?>ILING|NSACTIONAL)|U(?>E|NCATE))|YPE(?>S|))|U(?>N(?>BOUNDED|COMMITTED|IQUE|LOCK|SIGNED)|S(?>AGE|E|ING))|V(?>ARIABLES|IEW)|W(?>HEN|ITH|ORK|RITE)|YEAR_MONTH)/" dummy: 3.49 ms optimized: 0.82 ms dummy /w S: 3.42 ms

This tab shows result from various feature-branches currently under review by the php developers. Contact me to have additional branches featured.

Active branches

Archived branches

Once feature-branches are merged or declined, they are no longer available. Their functionality (when merged) can be viewed from the main output page


preferences:
40.88 ms | 424 KiB | 5 Q