PCRE(php)regex,带有+;与*不匹配';T

PCRE(php)regex,带有+;与*不匹配';T,php,regex,pcre,Php,Regex,Pcre,我想匹配并捕获所有现有的(如果有的话)您有四个问题: 首先和第二,使用正则表达式解析HTML 第三,你匹配的太多了:你至少需要让一些量词变懒,我说。E使用*?,[\s\s]*?等,否则您的正则表达式将匹配行或文件末尾的所有内容,然后仅根据需要回溯以查找最后一个可能的匹配标记 第四,你已经为自己设置了灾难性的回溯,在重复的组中有重复的组,这两个组都有无数种方法来匹配相同的文本 据我所知,您希望匹配从第一个标记到最后一个标记的所有内容,并捕获所有标记的内容和标记的内容。对吗?然后试试看 /(<

我想匹配并捕获所有现有的(如果有的话)
您有四个问题:

首先和第二,使用正则表达式解析HTML

第三,你匹配的太多了:你至少需要让一些量词变懒,我说。E使用
*?
[\s\s]*?
等,否则您的正则表达式将匹配行或文件末尾的所有内容,然后仅根据需要回溯以查找最后一个可能的匹配标记

第四,你已经为自己设置了灾难性的回溯,在重复的组中有重复的组,这两个组都有无数种方法来匹配相同的文本

据我所知,您希望匹配从第一个
标记到最后一个
标记的所有内容,并捕获所有
标记的内容和
标记的内容。对吗?然后试试看

/(<style[\s\S]+<\/style>)[\s\S]*?<body.*?>([\s\S]+)<\/body>/i

/(虽然你的正则表达式可以工作,但它不会独立地捕获样式块。例如,如果两个样式块直接在后面,你的解决方案是可以的,但是如果你在这些样式块之间有一些字符串,它会将其包含在结果中,这是我不想要的。因此,只有样式块本身。这写得含糊不清。让我ive示例:xxxyyyzz。您的解决方案为我提供了我不想要的yyy。您无法单独捕获
块。至少在JavaScript中是这样。NET有一个功能允许这样做,但大多数正则表达式引擎不允许(除非您事先知道最大重复次数)。我的解决方案从第一个到最后一个
块匹配,这是使用JS正则表达式所能做的最好的。如果我说,最多可以有4个样式块,那么可能“独立”不是正确的术语。它可能在1个catch中匹配,但没有我示例中的yyy。(据我所知,你的最后一个答案中是否包含了这一点还不够清楚。如果我错过了,很抱歉。)
/(<body.*>([\s\S]+)<\/body>)/i
/(<style[\s\S]+<\/style>)/i
/(<style[\s\S]+<\/style>)+/i
/(<style[\s\S]+<\/style>)*/i
/(<style[\s\S]+<\/style>)[\s\S]*?<body.*?>([\s\S]+)<\/body>/i
/(<style[\s\S]+?<\/style>)?\s*(<style[\s\S]+?<\/style>)?\s*(<style[\s\S]+?<\/style>)?\s*(<style[\s\S]+?<\/style>)?\s*<body.*?>([\s\S]+)<\/body>/i