Solved

PHP Preg Match All

Posted on 2009-07-05
5
531 Views
Last Modified: 2012-05-07
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

0
Comment
Question by:jwzk
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
5 Comments
 
LVL 39

Expert Comment

by:Roger Baklund
ID: 24780360
You need the 's' pattern modifer to match newlines:

preg_match_all("/id=\"firstUL(.+)\<\/div>/s", $file, $match1);
0
 
LVL 39

Accepted Solution

by:
Roger Baklund earned 500 total points
ID: 24780404
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
 

Author Comment

by:jwzk
ID: 24780416
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
 
LVL 39

Expert Comment

by:Roger Baklund
ID: 24780626
Use the 'U' (ungreedy) pattern modifier:

preg_match_all("/id=\"firstUL(.+)\<\/div>/sU", $file, $match1);
0
 

Author Closing Comment

by:jwzk
ID: 31599923
Perfect + the U modifier, thanks!
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

In this post we will learn how to make Android Gesture Tutorial and give different functionality whenever a user Touch or Scroll android screen.
These days socially coordinated efforts have turned into a critical requirement for enterprises.
The viewer will learn how to count occurrences of each item in an array.
The viewer will learn how to look for a specific file type in a local or remote server directory using PHP.

739 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question