<?php
// error : the unique element is deleted
$code='<?php
return array("*");
?>';
// error : the last element is deleted
$code='<?php
?>';
// ...
$pattern = <<<'EOD'
~
# elements
(?(DEFINE)
# comments
(?<comMulti> /\* .*? (?:\*/|\z) ) # multiline comment
(?<comInlin> (?://|\#) \N* $ ) # inline comment
(?<comments> \g<comMulti> | \g<comInlin> )
# strings
(?<strDQ> " (?>[^"\\]+|\\.)* ") # double quote string
(?<strSQ> ' (?>[^'\\]+|\\.)* ') # single quote string
(?<strHND> <<<(["']?)([a-zA-Z]\w*)\g{-2} (?>\R \N*)*? \R \g{-1} ;? (?=\R|$) ) # heredoc and nowdoc syntax
(?<string> \g<strDQ> | \g<strSQ> | \g<strHND> )
# brackets
(?<braCrl> { (?> \g<nobracket> | \g<brackets> )* } )
(?<braRnd> \( (?> \g<nobracket> | \g<brackets> )* \) )
(?<braSqr> \[ (?> \g<nobracket> | \g<brackets> )* ] )
(?<brackets> \g<braCrl> | \g<braRnd> | \g<braSqr> )
# nobracket: content between brackets except other brackets
(?<nobracket> (?> [^][)(}{"'</\#]+ | \g<comments> | / | \g<string> | <+ )+ )
# ignored elements
(?<s> \s+ | \g<comments> )
)
# array components
(?(DEFINE)
# key
(?<key> [0-9]+ | \g<string> )
# value
(?<value> (?> [^][)(}{"'</\#,\s]+ | \g<s> | / | \g<string> | <+ | \g<brackets> )+? (?=\g<s>*[,)]) )
)
(?J)
(?: \G (?!\A)(?<!\)) | array \g<s>* \( ) \g<s>* \K
(?: (?<key> \g<key> ) \g<s>* => \g<s>* )? (?<value> \g<value> ) \g<s>* (?:,|,?\g<s>*(?<stop> \) ))
~xsm
EOD;
// ...
$TMP=array();
// ...
if(preg_match_all($pattern,$code,$m,PREG_SET_ORDER))
foreach($m as $v)
if(empty($v['stop'])) {
if($v["key"])
eval('$v["key"]='.$v["key"].';');
if($v["key"])
$TMP[$v["key"]]=$v["value"];
else
$TMP[]=$v["value"];
}
// ...
var_export($TMP);
?>
PD9waHAKCi8vIGVycm9yIDogdGhlIHVuaXF1ZSBlbGVtZW50IGlzIGRlbGV0ZWQKCiRjb2RlPSc8P3BocAoKcmV0dXJuIGFycmF5KCIqIik7Cgo/Pic7CgovLyBlcnJvciA6IHRoZSBsYXN0IGVsZW1lbnQgaXMgZGVsZXRlZAoKJGNvZGU9Jzw/cGhwCgpyZXR1cm4gYXJyYXkoMSwyLDMpOwoKPz4nOwoKLy8gLi4uCgokcGF0dGVybiA9IDw8PCdFT0QnCn4KIyBlbGVtZW50cwooPyhERUZJTkUpCiAgICAjIGNvbW1lbnRzCiAgICAoPzxjb21NdWx0aT4gL1wqIC4qPyAoPzpcKi98XHopICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtdWx0aWxpbmUgY29tbWVudAogICAgKD88Y29tSW5saW4+ICg/Oi8vfFwjKSBcTiogJCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW5saW5lIGNvbW1lbnQKICAgICg/PGNvbW1lbnRzPiBcZzxjb21NdWx0aT4gfCBcZzxjb21Jbmxpbj4gKQoKICAgICMgc3RyaW5ncwogICAgKD88c3RyRFE+ICIgKD8+W14iXFxdK3xcXC4pKiAiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZG91YmxlIHF1b3RlIHN0cmluZwogICAgKD88c3RyU1E+ICcgKD8+W14nXFxdK3xcXC4pKiAnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2luZ2xlIHF1b3RlIHN0cmluZwogICAgKD88c3RySE5EPiA8PDwoWyInXT8pKFthLXpBLVpdXHcqKVxney0yfSAoPz5cUiBcTiopKj8gXFIgXGd7LTF9IDs/ICg/PVxSfCQpICkgICMgaGVyZWRvYyBhbmQgbm93ZG9jIHN5bnRheAogICAgKD88c3RyaW5nPiBcZzxzdHJEUT4gfCBcZzxzdHJTUT4gfCBcZzxzdHJITkQ+ICkKCiAgICAjIGJyYWNrZXRzCiAgICAoPzxicmFDcmw+IHsgKD8+IFxnPG5vYnJhY2tldD4gfCBcZzxicmFja2V0cz4gKSogfSApCiAgICAoPzxicmFSbmQ+IFwoICg/PiBcZzxub2JyYWNrZXQ+IHwgXGc8YnJhY2tldHM+ICkqIFwpICkKICAgICg/PGJyYVNxcj4gXFsgKD8+IFxnPG5vYnJhY2tldD4gfCBcZzxicmFja2V0cz4gKSogXSApCiAgICAoPzxicmFja2V0cz4gXGc8YnJhQ3JsPiB8IFxnPGJyYVJuZD4gfCBcZzxicmFTcXI+ICkKCiAgICAjIG5vYnJhY2tldDogY29udGVudCBiZXR3ZWVuIGJyYWNrZXRzIGV4Y2VwdCBvdGhlciBicmFja2V0cwogICAgKD88bm9icmFja2V0PiAoPz4gW15dWykofXsiJzwvXCNdKyB8IFxnPGNvbW1lbnRzPiB8IC8gfCBcZzxzdHJpbmc+IHwgPCsgKSsgKQoKICAgICMgaWdub3JlZCBlbGVtZW50cwogICAgKD88cz4gXHMrIHwgXGc8Y29tbWVudHM+ICkKKQoKIyBhcnJheSBjb21wb25lbnRzCig/KERFRklORSkgICAgCiAgICAjIGtleQogICAgKD88a2V5PiBbMC05XSsgfCBcZzxzdHJpbmc+ICkKCiAgICAjIHZhbHVlCiAgICAoPzx2YWx1ZT4gKD8+IFteXVspKH17Iic8L1wjLFxzXSsgfCBcZzxzPiB8IC8gfCBcZzxzdHJpbmc+IHwgPCsgfCBcZzxicmFja2V0cz4gKSs/ICg/PVxnPHM+KlssKV0pICkKKQooP0opCig/OiBcRyAoPyFcQSkoPzwhXCkpIHwgYXJyYXkgXGc8cz4qIFwoICkgXGc8cz4qIFxLCgogICAgKD86ICg/PGtleT4gXGc8a2V5PiApIFxnPHM+KiA9PiBcZzxzPiogKT8gKD88dmFsdWU+IFxnPHZhbHVlPiApIFxnPHM+KiAoPzosfCw/XGc8cz4qKD88c3RvcD4gXCkgKSkKfnhzbQpFT0Q7CgovLyAuLi4KCiRUTVA9YXJyYXkoKTsKCi8vIC4uLgoKaWYocHJlZ19tYXRjaF9hbGwoJHBhdHRlcm4sJGNvZGUsJG0sUFJFR19TRVRfT1JERVIpKQpmb3JlYWNoKCRtIGFzICR2KQppZihlbXB0eSgkdlsnc3RvcCddKSkgewoKCWlmKCR2WyJrZXkiXSkKCWV2YWwoJyR2WyJrZXkiXT0nLiR2WyJrZXkiXS4nOycpOwoKCWlmKCR2WyJrZXkiXSkKCSRUTVBbJHZbImtleSJdXT0kdlsidmFsdWUiXTsKCWVsc2UKCSRUTVBbXT0kdlsidmFsdWUiXTsKCn0KCi8vIC4uLgoKdmFyX2V4cG9ydCgkVE1QKTsKCj8+