如何使用preg_match获得差异

<?php
$format='(212) ### ### ##';
$phone='(212) 121 333 45';
$format=str_replace('(','\(',$format);
$format=str_replace(')','\)',$format);
$format=str_replace('.','\.',$format);
$format=str_replace('#','[0-9]',$format);
$pattern="/^".$format."$/";
//pattern->  /^\(212\) [0-9][0-9][0-9] [0-9][0-9][0-9] [0-9][0-9]$/
if (preg_match($pattern,$phone)) echo 'true'; else echo 'false';
?>

input (212) 121 333 45 I want result as; 1213345

It's success but this is only check. I want matched chars same time.

You can do this with a little "regex construction" work:

$format='(212) ### ### ##';
$phone='(212) 121 333 45';

// Quote any characters such as ( in the format so they match the input literally
// $regex == \(212\) ### ### ##
$regex = preg_quote($format, '/');

// Then surround any groups of #s with parens, making them capturing groups
// $regex == \(212\) (###) (###) (##)
$regex = preg_replace('/#+/', '(\0)', $regex);

// Finally, replace the placeholder # with \d and surround with slashes
// $regex == /\(212\) (\d\d\d) (\d\d\d) (\d\d)/
$regex = '/'.str_replace('#', '\d', $regex).'/';

Now we 're ready to roll:

if (preg_match($regex, $phone, $matches)) {
    echo "Matched: ".implode('', array_slice($matches, 1));
}
else {
    echo "No match";
}

The construct array_slice($matches, 1) creates an array of the contents of each capturing group, so with the example input it would result in the array ['121', '333', '45']. implode joins these bits together, producing 12133345.

See it in action.