PHP Preg Match All

I am trying to match UL's in an HTML file via PHP. I want to match #firstUL and get all of the LI's out of only that ID. Same thing for #secondLI.

preg_match_all("/id=\"firstUL(.+)\<\/div>/", $file, $match1);
preg_match_all("/<li><a href=\"(.*)\">(.*)<\/a><\/li>/", $match1[0][0], $match2);

The outcome I am looking for is:

[0] -> [0] = '/index.php', [1] = 'Example'
[1] -> [0] = '/index.php', [1] = 'Example'
[2] -> [0] = '/index.php', [1] = 'Example'
<div id="firstUL">
	<div class="someclass">
		<ul>
			<li><a href="/index.php">Example</a></li>
			<li><a href="/index.php">Example</a></li>
			<li><a href="/index.php">Example</a></li>
			<li><a href="/index.php">Example</a></li>
			<li><a href="/index.php">Example</a></li>
			<li><a href="/index.php">Example</a></li>
		</ul>
		<ul>
			<li><a href="/index.php">Example</a></li>
			<li><a href="/index.php">Example</a></li>
			<li><a href="/index.php">Example</a></li>
			<li><a href="/index.php">Example</a></li>
			<li><a href="/index.php">Example</a></li>
			<li><a href="/index.php">Example</a></li>
		</ul>
	</div>
</div>
<div id="secondUL">
	<div class="someclass">
		<ul>
			<li><a href="/index.php">Example</a></li>
			<li><a href="/index.php">Example</a></li>
			<li><a href="/index.php">Example</a></li>
			<li><a href="/index.php">Example</a></li>
			<li><a href="/index.php">Example</a></li>
			<li><a href="/index.php">Example</a></li>
		</ul>
		<ul>
			<li><a href="/index.php">Example</a></li>
			<li><a href="/index.php">Example</a></li>
			<li><a href="/index.php">Example</a></li>
			<li><a href="/index.php">Example</a></li>
			<li><a href="/index.php">Example</a></li>
			<li><a href="/index.php">Example</a></li>
		</ul>
	</div>
</div>

Open in new window

jwzkAsked:
Who is Participating?

[Webinar] Streamline your web hosting managementRegister Today

x
 
Roger BaklundConnect With a Mentor Commented:
For the result array you wanted, try this:
preg_match_all("/id=\"firstUL(.+)\<\/div>/s", $file, $match1);
preg_match_all("/<li><a href=\"(.*)\">(.*)<\/a><\/li>/", $match1[0][0], $match2);
$result = array();
for($i=0;$i<count($match2[1]);$i++)
  $result[]=array($match2[1][$i],$match2[2][$i]);
echo '<pre>';
var_dump($result);
echo '</pre>';

Open in new window

0
 
Roger BaklundCommented:
You need the 's' pattern modifer to match newlines:

preg_match_all("/id=\"firstUL(.+)\<\/div>/s", $file, $match1);
0
 
jwzkAuthor Commented:
Perfect, the only problem is the first preg_match_all is still getting both UL's.

This works, but is it the best method? I would prefer to not have to set the second one incase it changes.

preg_match_all("/id=\"firstUL(.+)\id=\"secondUL/s", $fileData, $match1);
0
 
Roger BaklundCommented:
Use the 'U' (ungreedy) pattern modifier:

preg_match_all("/id=\"firstUL(.+)\<\/div>/sU", $file, $match1);
0
 
jwzkAuthor Commented:
Perfect + the U modifier, thanks!
0
All Courses

From novice to tech pro — start learning today.