Не используйте столько неявных не жадных выражений, как .*?
. Несмотря на то, что они делают то, что вы хотите, они часто возвращаются назад и, таким образом, делают все ваше выражение неэффективным. Особенно, когда вы используете их так много.
Постарайтесь быть максимально явным:
#<tr\b(?:[^"'>]*|"[^"]*"|'[^']*')*>\s*
<td\b(?:[^"'>]*|"[^"]*"|'[^']*')*>((?:[^<]|(?!</td\s*>)<)*)</td\s*>\s*
<td\b(?:[^"'>]*|"[^"]*"|'[^']*')*>((?:[^<]|(?!</td\s*>)<)*)</td\s*>\s*
<td\b(?:[^"'>]*|"[^"]*"|'[^']*')*>((?:[^<]|(?!</td\s*>)<)*)</td\s*>\s*
<td\b(?:[^"'>]*|"[^"]*"|'[^']*')*>((?:[^<]|(?!</td\s*>)<)*)</td\s*>\s*
<td\b(?:[^"'>]*|"[^"]*"|'[^']*')*>((?:[^<]|(?!</td\s*>)<)*)</td\s*>\s*
</tr\s*>#sx
Но, как вы видите, это беспорядок.
Вам лучше использовать HTML-анализатор, такой как DOMDocument . Затем вы можете запросить элементы с помощью XPath, как предложил Брайан Агнью. Это намного надежнее и удобнее, чем регулярные выражения.