$re = '/(?(DEFINE)(?\'value\'(?:\N*(?:\n(?:(?: {8}|\t)\N*))*)))\s*pool: (?\'pool\'\g\'value\')\n\s*state: (?\'state\'\g\'value\')\n((?:\s*status: (?\'status\'\g\'value\')\n)?(?:\s*action: (?\'action\'\g\'value\')\n)?\s*scan: (?\'scan\'\g\'value\')\n)?\s*config:\n\n(?\'config\'\g\'value\')\n\s*errors: (?\'errors\'\g\'value\')/s';
$str = ' pool: zfs
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
zfs ONLINE 0 0 0
ata-HGST_HTS725050A7E630_TF655AY92LL99L ONLINE 0 0 0
errors: No known data errors';
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