Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 为什么我的preg_match_all语句捕获的内容比它应该捕获的要多?_Regex_Preg Match All - Fatal编程技术网

Regex 为什么我的preg_match_all语句捕获的内容比它应该捕获的要多?

Regex 为什么我的preg_match_all语句捕获的内容比它应该捕获的要多?,regex,preg-match-all,Regex,Preg Match All,我正在清理内容并将其迁移到新网站。在某些现有页面中,有嵌入的图像链接到非标准文件夹中的文件 我从数据库中提取记录,然后进行“preg_match_all”以捕获违规项目。我的目的是清理文件名,移动有问题的文件,然后更新数据库条目以反映新位置 然而,出于某种原因,我的regex语句似乎只找到了一个匹配项(已知的多个潜在命中数),有时似乎捕获了我想要的字符串下游的全部其他内容 这是我正在使用的表达式模式: (?i)(<img.*src="uploads/RTEmagicC_(.*)")/ (

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

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

然而,出于某种原因,我的regex语句似乎只找到了一个匹配项(已知的多个潜在命中数),有时似乎捕获了我想要的字符串下游的全部其他内容

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

(?i)(<img.*src="uploads/RTEmagicC_(.*)")/
(?i)(
这是我匹配的数据库内容的一个示例:

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\u Herpes\u simpex\u virus.jpg.jpg”

但是除了关闭文件名的
,它还匹配了一堆下游内容

有人能帮我摆脱痛苦吗?我已经试了几个晚上了,很明显我在做一些愚蠢的事情,但我看不到什么


非常感谢。

默认情况下,regex是贪婪匹配的,因此
*
尽可能匹配,包括其他
直到最后一个
它可以找到。在
img
之后使用的
*
也是如此。您可以使用惰性匹配,通过向您的量词添加
来匹配尽可能少的匹配,因此在您的情况下,这将是
(?i)


对于您的测试字符串,您不需要一个
*?
,一个简单的
\s+
(匹配一个或多个空格字符)就足够了-但这可能不是所有数据的情况。您还可以将第二个
*?
替换为
[^]*
,匹配任意数量的非引号。

非常感谢;但是,我现在没有捕获RTEMGICC位下游的文件名。结果是:0=>''抱歉-在我有机会完成键入之前就发布了。非常感谢-#(?I)(不要使用正则表达式来解析HTML,请使用像
DOMDocument
这样的HTML解析器。谢谢;但我必须承认,我不知道怎么做,也不知道不使用正则表达式背后的原理。你能解释一下,或者给我一个参考吗?谢谢你@Barmar注意投票数第二高的答案,OP似乎很了解我们我会告诉你他想从内容中得到什么。