Вот регулярное выражение, если вы хотите использовать его вместо парсера, поскольку он, возможно, быстрее и использует меньше служебных данных.
$content = <<<EOD
<div id="cat_list">
<h4>Browse by Category</h4>
<ul>
<li class="a"><a href="link1.php">category1</a></li>
<li class="b"><a href="link2.php">category2</a></li>
</ul>
</div>
EOD;
$categories = array();
if (preg_match('/<div id="cat_list">(.*?)<\/div>/is', $content, $cat_list)) {
$matches = preg_match_all('/<li[^>]*><a href="([^"]+)">([^<]+)<\/a>/i', $cat_list[1], $cats);
for ($i = 0; $i < $matches; ++$i) {
$categories[$cats[2][$i]] = array('href' => $cats[1][$i], 'name' => $cats[2][$i]);
}
}
var_dump($categories);
Результаты:
array(2) {
["category1"]=>
array(2) {
["href"]=>
string(9) "link1.php"
["name"]=>
string(9) "category1"
}
["category2"]=>
array(2) {
["href"]=>
string(9) "link2.php"
["name"]=>
string(9) "category2"
}
}