PHP:Preg_Match_所有奇怪的行为

时间:2013-10-21 18:02:18

标签: php regex recursion preg-match-all

我有一个匹配大字符串的模式,使用preg_match_all,它正好得到正确的匹配但是它似乎进入每个匹配并尝试找到更多匹配,然后进入每个匹配当它最终在空字符串上时停止。听起来像某种递归,但我不需要也不想要这个,有没有办法阻止它?

感谢您的帮助!

function getCategories($source)
{
    $categories = array();

    $pattern = "~<span class=.*\n<table class=.*\n<tr>\n<th.*\n<.th>\n<th.*\n<.th>\n<th.*\n<.th>\n<th.*\n<.th>\n<th.*\n<.th>\n<th.*\n<.th><.tr>\n(<tr id=.*\n(.*\n){6}<.td><.tr>(<.table>)?\n)*~";

    preg_match_all($pattern, $source, $categories);

    return $categories;
}

$categories = getCategories($source);

print_r($categories);

1 个答案:

答案 0 :(得分:1)

此行为的原因是因为有多个实例使用.*个术语。

该术语可以对应于任何字符串长度,并且可以跨越示例中的多个tr标记。

您需要使用非贪婪版本.*?。应该这样做。

注意:正如所建议的,执行您尝试的操作的最佳方法是将DOM结构解析为DOMElement或XML