减少正则表达式的包容性
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&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&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 稍作更改可能会破坏整个正则表达式。
我有一个正则表达式,我正试图从字符串中提取出来。它似乎包括太多了。这是我的代码。
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&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&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 稍作更改可能会破坏整个正则表达式。