Regex 如何在重复之间匹配可选组?

Regex 如何在重复之间匹配可选组?,regex,Regex,我需要匹配HTML元素和可选的“父名称”属性 <rect x='300' y='1150' rx='10' ry='10' width='361' height='65' state-name='ReadyForProduction' parent-name='Active' fill='url(#grad_#9FA0DD)' style='stroke: black; stroke-width:1; opacity:1.0'/> <rect x='300' y='1150'

我需要匹配HTML元素和可选的“父名称”属性

<rect x='300' y='1150' rx='10' ry='10' width='361' height='65' state-name='ReadyForProduction' parent-name='Active' fill='url(#grad_#9FA0DD)' style='stroke: black; stroke-width:1; opacity:1.0'/>
<rect x='300' y='1150' rx='10' ry='10' width='361' height='65' state-name='SomethingElse' fill='url(#grad_#9FA0DD)' style='stroke: black; stroke-width:1; opacity:1.0'/>
我应该如何匹配所有受试者,并在重复之间捕获该组受试者(如果存在)


这一个应该符合您的需要:
您可以将父名称之前的零件也推入非捕获组。如果没有父名称,则非捕获组后面的后缀将与其匹配

^]*?父名称='(.+?)?[^>]*?\/>


对于Regex,尽可能具体化会有所帮助。因此,基本上,匹配标记,并循环匹配有效属性,与您希望首先捕获的属性(第一个匹配赢得优先级)。这也将使正则表达式在处理大型文档时更加高效

<rect[^<]*?(?:parent-name='(.+?)')[^<]*?\/>
<rect[^<]*?(?:parent-name='(.+?)')?[^<]*?\/>
$re = '/<rect.*?((parent-name)=\'([^\']*)\').*?\/>|<rect.*?\/>/';
$str = '<rect x=\'300\' y=\'1150\' rx=\'10\' ry=\'10\' width=\'361\' height=\'65\' state-name=\'ReadyForProduction\' parent-name=\'Active\' fill=\'url(#grad_#9FA0DD)\' style=\'stroke: black; stroke-width:1; opacity:1.0\'/>

<rect x=\'300\' y=\'1150\' rx=\'10\' ry=\'10\' width=\'361\' height=\'65\' state-name=\'ReadyForProduction\' fill=\'url(#grad_#9FA0DD)\' style=\'stroke: black; stroke-width:1; opacity:1.0\'/>';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
var_dump($matches);
<rect(?:(?:\sparent-name='[^']*')|\s[A-z-]+='[^']*')*\/>