使正则表达式更具包容性

时间:2015-08-17 21:30:01

标签: php regex preg-match-all

我有一个正则表达式我试图摆脱一个字符串。它似乎包括太多的方式。这是我的代码。

preg_match_all('/<li class="has-activity"><a class="group-entity" 
href="(.*?)"><span class="activity-count">(.*)<\/span><span 
class="image"><img alt="(.*?)" src/i',$output,$matches);

我只是想让它抓住(。*?)中看到的东西,但它似乎想要抓住更多。

更多信息:

这是我尝试从中提取的一个例子。这只是一个实体。 (使用preg_match_all)

<li class="has-activity"><a class="group-entity" href="/grp/home?gid=2813868&amp;trk=my_groups-tile-grp">
<span class="activity-count">7</span>
<span class="image"><img alt="[Rated #1 in Marketing] The Social Media Marketing Group" src

我需要抓住的两件主要事情是群href(&#34; / grp / home?gid = 2813868&amp; trk = my_groups-tile-grp&#34;在这个例子中)和群组名称(事物)在alt标签之间。&#34; [营销中的评级#1]社交媒体营销组&#34;在这种情况下)

使用我更新的代码(。?*),似乎抓住NAME就好了。但是,我无法正确地抓住该组织的href。

2 个答案:

答案 0 :(得分:2)

对于初学者,因为.*似乎与属性相匹配,所以可以将其替换为[^"]*

preg_match_all('/<li class="has-activity"><a class="group-entity" 
href="([^"]*)"><span class="activity-count">(.*)<\/span><span 
class="image"><img alt="([^"]*)"/i',$output,$matches);

如果在span内没有更多标签,只需要使用文字

preg_match_all('/<li class="has-activity"><a class="group-entity" 
href="([^"]*)"><span class="activity-count">([^<]*)<\/span><span 
class="image"><img alt="([^"]*)"/i',$output,$matches);

这是确切的,并且不会匹配更多也不会覆盖元素和属性,尽管(常规)xml/html解析使用正则表达式并不容易

<强>更新

html示例代码

<li class="has-activity"><a class="group-entity" href="/grp/home?gid=2813868&amp;trk=my_groups-tile-grp"><span class="activity-count">6</span><span class="image"><img alt="[Rated #1 in Marketing] The Social Media Marketing Group" src

<a class="group-entity" href="LINK"并且需要提取该alt代码的img

使用以下

preg_match_all('/<li.*?class="has-activity".*?href="([^"]*)".*?<img.*?alt="([^"]*)"/i',$output,$matches);

尽量不要使用preg_match_all,如果需要添加multiline flag (i.e '/../m'),如果需要更精确的匹配,请使用xml解析器(如建议的那样)

答案 1 :(得分:1)

preg_match_all('<li class="has\-activity"><a class="group\-entity" href=(.*?)"><span class="activity\-count">([0-9]+)<\/span><span class="image"><img alt="(.*)" src/i',$output,$matches);

正则表达式不是提取html的最佳工具。它可能变得非常混乱。我发现jQuery对于提取html内容非常有用,然后如果需要,我可以在PHP中对它执行字符串操作。

正则表达式对html如此棘手的原因是边缘情况。对html的轻微更改可能会破坏整个正则表达式。