减少正则表达式的包容性

Making regex less inclusive

我有一个正则表达式,我正试图从字符串中提取出来。它似乎包括太多了。这是我的代码。

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(在本例中为“/grp/home?gid=2813868&trk=my_groups-tile-grp”)和组名称(alt 标记之间的内容.“[在营销中排名第一]社交媒体营销集团”在这种情况下)

使用我更新的 (.?*) 代码,它似乎可以很好地获取 NAME。但是我无法正确获取该组的 href。

对于初学者来说,因为 .* 似乎匹配属性,所以可以用 [^"]*

替换它们

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);

if inside 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"img 标签的 alt 需要提取

使用以下内容

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

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

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 稍作更改可能会破坏整个正则表达式。