If you are simply trying to extract what is between the tags, then you can resort to something like this:
$str = "<title>Home Page</title>";
preg_match("#<title>([^<]*)</title>#", $str, $match);
echo $match[1];
It is important to note that using . is very inefficient. The reason for this is that the regex engine ends up matching the rest of the string first (inserting a saved state after each character that the dot matches (which is everything but a newline), so when looking at your initial pattern, after the <title> part, the . (you have . , but I assume you meant .) = 'Home Page</title>' (it gobbles up the rest of the line).
Then the regex engine says, 'hey wait a minute.. I still need to fullfill the rest of the expression '</title>'.. so now the engine needs to backtrack one character at a time and compare each 'relinquished character' from .* with '</title>'.. this would take about 8 backtracks to accomplish this..
so it would relinquish the last character first '>' and see if that matches '</title>'. No.
so then it relinquishes 'e>' and sees if that matches '</title>'. No.
so then it relinquishes 'le>' and sees if that matches '</title>'. No.
so then it relinquishes 'tle>' and sees if that matches '</title>'. No.
on and on until the complete characters '</title>' is relinquished, which will then match.. as you can see.. not efficient at all...
But by using [<]*, this is saying, match anything that is not a '<' character, zero or more times.. so instead of matching up to the end of the string, and then needing to backtrack to allow for the rest of the pattern to match, the regex engine only matches up to the '<', then conitnues with the rest of the match (no backtracking required).
It's a faster, more efficient method for the regex engine in general.