$re = '~(?(DEFINE)
(?<prepend>
(?>
\s++
| #multi-line comment by Jeffrey Friedl (fastest)
/\*
[^*]* \*+
(?:[^*/][^*]*\*+)*
/
| ;++
)*+
)
#https://www.postgresql.org/docs/11/sql-commands.html
(?<command>abort|alter|begin|cache|call|checkpoint|cluster|comment|commit|copy|create|deallocate|delete|discard|do|drop|execute|flush|grant|import\s++foreign\s++schema|insert|kill|load|lock|prepare|prepare\s++transaction|reassign\s++owned|refresh\s++materialized\s++view|release\s++savepoint|rename|replace|reset|revoke|rollback|select\s++into|set\s++constraints|start\s++transaction|truncate|update)
)
^
(?&prepend)
\K
(?&command)
\b
(?!
(?&prepend)
\( #REPLACE() function can be similar to command
)~ixmXs';
$str = 'WITH t1 AS (
-- UPDATE
/* INSERT */
SELECT *
FROM t
WHERE s =
REPLACE(s, \'a\', \'b\')
),
t2 AS (
-- комментарий UPDATE
/* INSERT
*/UPDATE--
* FROM t SET i = 1
RETURNING *
),
INSERT b
SELECT * FROM t2';
preg_match($re, $str, $matches, PREG_OFFSET_CAPTURE, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php