为什么我的preg_match_all语句捕获的数量超过它应该的数量?

时间:2016-11-09 23:02:24

标签: regex preg-match-all

我正在清理内容并将内容迁移到新网站。在一些现有页面中,存在链接到非标准文件夹中的文件的嵌入图像。

我从数据库中提取记录,然后执行“preg_match_all”来捕获违规项目。我的意图是清理文件名,移动有问题的文件,然后更新数据库条目以反映新的位置。

然而,由于某种原因,我的正则表达式语句似乎只找到一个匹配(已知的多个潜在命中),有时似乎捕获了我想要的字符串下游的其他东西的全部负载。

这是我正在使用的表达模式:

(?i)(<img.*src="uploads/RTEmagicC_(.*)")/

这是我匹配的数据库中的内容示例:

BLAH BLAH BLAH<img src="uploads/RTEmagicC_Herpes_simpex_virus.jpg.jpg" alt="HSV particles" style="FLOAT: left; WIDTH: 214px; HEIGHT: 198px" title="Electron micrograph of HSV particles©NASA">blah blah blah<img src="uploads/RTEmagicC_Herpes_labialis_01.jpg.jpg" alt="Coldsore" style="FLOAT: right;" title="Cold sore on the lower lip (cluster of fluid-filled blisters = very infectious). These infections may appear on the lips, nose or in surrounding areas.©Metju12" width="238" height="178">blah blah blah

我想抓住: "Herpes_simpex_virus.jpg.jpg""Herpes_labialis_01.jpg.jpg"以及相应的完整链接,例如: "img src="uploads/RTEmagicC_Herpes_simpex_virus.jpg.jpg"

但它也匹配了一堆下游内容,超出了关闭文件名的"

有人可以把我从痛苦中解救出来吗?我已经尝试了几个晚上,显然我做了一些愚蠢的事,但我看不出是什么......

非常感谢。

1 个答案:

答案 0 :(得分:-1)

默认情况下,正则表达式贪婪地匹配,因此.*尽可能匹配,包括其他",直到它可以找到的最后"。您在.*之后使用的img也是如此。您可以通过向量词组添加?来使用尽可能少的延迟匹配,因此在您的情况下,这将是(?i)<img.*?src="uploads/RTEmagicC_(.*?)"

对于测试字符串,您不需要.*?,简单的\s+(匹配一个或多个空白字符)就足够了 - 但对于所有数据而言可能并非如此。您还可以将.*?替换为[^"]*,匹配任意数量的非引号。