OK...i'm pretty new at regular expressions, but this one worked on that particular example...
preg_match_all("/(Source:.*?<A .*?>)([^<]*)(.*?Date:<.*?><.*?>\s*<.*?><.*?>)([^<]*)/", $html_string, $out_source);
echo "<BR><BR>";
//echo htmlspecialchars($out_source[1][0]) . '<BR>';
echo $out_source[2][0] . '<BR>';
//echo htmlspecialchars($out_source[3][0]) . '<BR>';
echo $out_source[4][0] . '<BR>';
the expression i used is CASE SENSITIVE and says basically look for 'Source:' followed by possibly some characters then an A tag which encloses the Source_Title which doesn't include any < characters. Then, find "Date:" (again, case sensitive, this won't find 'DATE:,' for instance) which is followed by two HTML elements, some white space, 2 more HTML elements, and then your Source_date. the output array has your desired results in the 0 index of its 2nd and 4th elements.
sorry if this sounds convoluted...pattern matching is crazy.