Regex Reg ex查询太贪婪了

Regex Reg ex查询太贪婪了,regex,Regex,考虑以下代码段: <Offering id=1 blah blah templateid=abc something=blah gretre rtert ret tr /Offering> <Offering id=2 blah blah templateid=def something=blah> gretre rtert ret tr </Offering> <Offering id=3 blah blah templateid=ghi some

考虑以下代码段:

<Offering id=1 blah blah templateid=abc something=blah
gretre
rtert
ret
tr
/Offering>

<Offering id=2 blah blah templateid=def something=blah>
gretre
rtert
ret
tr
</Offering>

<Offering id=3 blah blah templateid=ghi something=blah>
gretre
rtert
ret
tr
</Offering>

格雷特
特尔特
ret
tr
格雷特
特尔特
ret
tr
考虑到我只知道模板id,我需要返回包含它的整个产品节点。i、 e.对于templateid=def,我需要返回:

   <Offering id=2 blah blah templateid=def something=blah>
    gretre
    rtert
    ret
    tr
    </Offering>

格雷特
特尔特
ret
tr

我尝试过各种方法,但我能得到的最接近于
(?s)的东西你可以使用否定来修改你的正则表达式,我可能也会使用单词边界

<Offering[^>]*\btemplateid=def[^>]*>[^<]*</Offering>

]*\btemplateid=def[^>]*>[^这应该可以,但是请注意,我转义了
/
字符,根据您使用的语言,您可能不需要这样做:

(<Offering[^>]* templateid=ghi [^>]*>[^<]*<\/Offering>)
(]*templateid=ghi[^>]*>[^正如您所说的“需要返回整个提供的节点””,可以说更简单、更安全、更可读的方法是DOM解析器。我在下面的JavaScript和PHP中提供了一些示例

PHP

JavaScript

var testStr = document.getElementById('str_container').innerHTML;

var parser = new DOMParser();
var doc = parser.parseFromString(testStr,'text/html');
var templateID = 'def';
var myEl = null;
for(var i=0,c=doc.body.children.length;i<c;i++)
{
    if(doc.body.children[i].getAttribute('templateid')===templateID)
    {
        myEl = doc.body.children[i];
    }
}
//var id = myEl.id;
//var html = myEl.outerHTML;
console.log(myEl || 'not found');

“blah”中有什么类型的字符?允许使用任何字符吗?它需要是正则表达式吗?文档解析器会更安全,更适合手头的任务。还有,您使用的是什么语言?谢谢hwnd,第二个正则表达式正是我所需要的:-)我尝试过做一些类似的事情(尝试过)要像这样否定结束提供标签:(?s)感谢SmokeyHP-这是计划B,但由于我还使用了许多正则表达式模式来匹配文档中的其他字符串,所以我希望保持一致。
$doc = new DOMDocument();
@$doc->loadHTML($testStr); //Only needed if you're loading HTML like in the example which has repeated attributes and other things that could cause errors
$body = $doc->getElementsByTagName('body')->item(0);
$templateID = 'def';
$myNode = null;
foreach($body->childNodes as $node)
{
    if($node->nodeName=='offering')
    {
        if($node->attributes->getNamedItem('templateid')->nodeValue == $templateID)
        {
            $myNode = $node;
        }
    }
}
//$id = $myNode->attributes->getNamedItem('id')->nodeValue;
//$html = $doc->saveHTML($myNode)
var testStr = document.getElementById('str_container').innerHTML;

var parser = new DOMParser();
var doc = parser.parseFromString(testStr,'text/html');
var templateID = 'def';
var myEl = null;
for(var i=0,c=doc.body.children.length;i<c;i++)
{
    if(doc.body.children[i].getAttribute('templateid')===templateID)
    {
        myEl = doc.body.children[i];
    }
}
//var id = myEl.id;
//var html = myEl.outerHTML;
console.log(myEl || 'not found');
var testStr = document.getElementById('str_container').innerHTML;

var parser = new DOMParser();
var doc = parser.parseFromString(testStr,'text/html');
var templateID = 'def';
var myEl = doc.body.querySelector('offering[templateid='+templateID+']');
//var id = myEl.id;
//var html = myEl.outerHTML;
console.log(myEl || 'not found');