Re: Regex pattern for preg_match_all
| From: | Simon J Welsh | Date: | Fri, 18 Feb 2011 21:56:20 +0000 |
| Subject: | Re: Regex pattern for preg_match_all | ||
| References: | 1 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-311435@lists.php.net to get a copy of this message | ||
As far as I can tell, your problem lies in [^href]*. That will match any characters other than h, r,
e or f, not anything other than the string href. Consider replacing it with [^>]*?. The ? makes
it non-greedy so it will stop as soon as it can (when it matches the first href) rather than as late
as it can (when it matches a >)
---
Simon Welsh
Sent from my phone, excuse the brevity
On 19/02/2011, at 10:36, Tommy Pham <tommyhp2@gmail.com> wrote:
> Hi folks,
>
> This is not directly relating to PHP but it's Friday so I'm gonna give
> it a shot :). Would someone please help me figure out why my regex
> pattern doesn't work. Below is the code and sample data:
>
> $html = <<<HTML
> <li class="small tab "><a class="y-mast-link images"
> href="http://images.search.yahoo.com/images"
> data-b="http://www.yahoo.com"><span
> class="tab-cover y-mast-bg-hide"
>
> style="padding-left:0em;padding-right:0em;">Images</span></a></li>
> <li class="small tab "><a class="y-mast-link video"
> href="http://video.search.yahoo.com/video"
> data-b="http://www.yahoo.com"><span
> class="tab-cover y-mast-bg-hide"
>
> style="padding-left:0em;padding-right:0em;">Video</span></a></li>
> <li class="small tab "><a class="y-mast-link local"
> href="http://local.yahoo.com/results"
> data-b="http://www.yahoo.com"><span
> class="tab-cover y-mast-bg-hide"
>
> style="padding-left:0em;padding-right:0em;">Local</span></a></li>
> <li class="small tab "><a class="y-mast-link shopping"
> href="http://shopping.yahoo.com/search"
> data-b="http://www.yahoo.com"><span
> class="tab-cover y-mast-bg-hide"
>
> style="padding-left:0em;padding-right:0em;">Shopping</span></a></li>
> <li class="small lasttab more-tab "><a class="y-mast-link more"
>
> href="http://tools.search.yahoo.com/about/forsearchers.html"
> ><span
> class="tab-cover y-mast-bg-hide">More</span><span
> class="y-fp-pg-controls arrow"></span></a></li>
> HTML;
>
> $pattern =
> '%<a\s[^href]*href\s*=\s*[\'|"]?([^\'|"|#]+)[\'|"]?\s*[^>]*>(.*)?</a>%im';
> preg_match_all($pattern, $html, $matches);
>
> The only matches I got is:
>
> Match 1 of 1: <a class="y-mast-link local"
> href="http://local.yahoo.com/results"
> data-b="http://www.yahoo.com"><span
> class="tab-cover y-mast-bg-hide"
> style="padding-left:0em;padding-right:0em;">Local</span></a>
>
> Group 1: http://local.yahoo.com/results
>
> Group 2: <span class="tab-cover y-mast-bg-hide"
> style="padding-left:0em;padding-right:0em;">Local</span>
>
> The pattern I made was to work in cases where the page is
> non-compliant to any of standard W3.
>
> Thanks,
> Tommy
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>