3v4l.org

run code in 300+ PHP versions simultaneously
<?php class Element { const TYPE_LITERAL = 0; const TYPE_GROUP = 1; const END_OF_STRING = 2; public $type; public $value; public $next = self::END_OF_STRING; } function buildGraph($tokens) { $root = new Element; $root->type = Element::TYPE_GROUP; while ( $tokens->valid() ) { $token = $tokens->current(); $tokens->next(); switch ($token) { case '(': if ( isset($current) ) { $current->next = buildGraph($tokens); $current = $current->next; } else { $root->value[] = buildGraph($tokens); $current = end($root->value); } break; case ')': $current->next = &$root->next; return $root; case '|': $current->next = &$root->next; unset($current); break; default: if ( isset($current) ) { $current->next = new Element; $current = $current->next; } else { $root->value[] = new Element; $current = end($root->value); } $current->type = Element::TYPE_LITERAL; $current->value = $token; } } $root->next = Element::END_OF_STRING; return $root; } function getPaths($elt, $prefix = '') { if ( $elt === Element::END_OF_STRING ) { yield $prefix; return; } switch($elt->type) { case Element::TYPE_LITERAL: $prefix .= $elt->value; yield from getPaths($elt->next, $prefix); break; case Element::TYPE_GROUP: foreach ($elt->value as $value) { yield from getPaths($value, $prefix); } break; } } $pattern = 'chap(i|a) chap(o|a) p(a|i)t(a|i)p(o|a)'; // validation $validationPattern = '~ \A ( [^()]+ | \( (?1)* \) )* \z ~x'; if ( !preg_match($validationPattern, $pattern) ) throw new Exception('invalid pattern.'); // tokenization $tokens = (function ($regex) { if ( preg_match_all('~ [^()|]+ | (?<![^(|]) (?![^|)]) | [()|] ~x', $regex, $matches) ) yield from $matches[0]; })($pattern); $graph = buildGraph($tokens); foreach (getPaths($graph) as $path) { echo $path, PHP_EOL; }
Output for 7.1.0 - 7.1.33, 7.2.0 - 7.2.33, 7.3.0 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.28, 8.2.0 - 8.2.19, 8.3.0 - 8.3.4, 8.3.6 - 8.3.7
chapi chapo patapo chapi chapo patapa chapi chapo patipo chapi chapo patipa chapi chapo pitapo chapi chapo pitapa chapi chapo pitipo chapi chapo pitipa chapi chapa patapo chapi chapa patapa chapi chapa patipo chapi chapa patipa chapi chapa pitapo chapi chapa pitapa chapi chapa pitipo chapi chapa pitipa chapa chapo patapo chapa chapo patapa chapa chapo patipo chapa chapo patipa chapa chapo pitapo chapa chapo pitapa chapa chapo pitipo chapa chapo pitipa chapa chapa patapo chapa chapa patapa chapa chapa patipo chapa chapa patipa chapa chapa pitapo chapa chapa pitapa chapa chapa pitipo chapa chapa pitipa
Output for 8.3.5
Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0 chapi chapo patapo chapi chapo patapa chapi chapo patipo chapi chapo patipa chapi chapo pitapo chapi chapo pitapa chapi chapo pitipo chapi chapo pitipa chapi chapa patapo chapi chapa patapa chapi chapa patipo chapi chapa patipa chapi chapa pitapo chapi chapa pitapa chapi chapa pitipo chapi chapa pitipa chapa chapo patapo chapa chapo patapa chapa chapo patipo chapa chapo patipa chapa chapo pitapo chapa chapo pitapa chapa chapo pitipo chapa chapo pitipa chapa chapa patapo chapa chapa patapa chapa chapa patipo chapa chapa patipa chapa chapa pitapo chapa chapa pitapa chapa chapa pitipo chapa chapa pitipa

preferences:
132.5 ms | 403 KiB | 204 Q