我正在清理内容并将内容迁移到新网站。在一些现有页面中,存在链接到非标准文件夹中的文件的嵌入图像。
我从数据库中提取记录,然后执行“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"
但它也匹配了一堆下游内容,超出了关闭文件名的"
。
有人可以把我从痛苦中解救出来吗?我已经尝试了几个晚上,显然我做了一些愚蠢的事,但我看不出是什么......
非常感谢。
答案 0 :(得分:-1)
默认情况下,正则表达式贪婪地匹配,因此.*
尽可能匹配,包括其他"
,直到它可以找到的最后"
。您在.*
之后使用的img
也是如此。您可以通过向量词组添加?
来使用尽可能少的延迟匹配,因此在您的情况下,这将是(?i)<img.*?src="uploads/RTEmagicC_(.*?)"
。
对于测试字符串,您不需要.*?
,简单的\s+
(匹配一个或多个空白字符)就足够了 - 但对于所有数据而言可能并非如此。您还可以将.*?
替换为[^"]*
,匹配任意数量的非引号。