/ / Bis zum zweiten Auftreten - php, regex

Übereinstimmung bis zum zweiten Auftreten - php, regex

Ich habe diese Zeichenfolge:

<h3>Test</h3><table></table><table></table><table></table>

Mein erwartetes Ergebnis:

<h3>Test</h3><table></table><table></table>

Ich habe es versucht:

<h3>Test</h3>.+?(/table>)

aber es ist faul Ausdruck, so wird das Ergebnis sein:

<h3>Test</h3><table></table>

Wenn ich nicht falsch liege, muss ich HTML Dom Parser für diese Aufgabe verwenden, aber nur neugierig, wie man es in diesem Fall mit Regex machen kann.

Antworten:

0 für die Antwort № 1

Ein Beispiel für die Verwendung von Lazy Expression ist:

"<h3>Test</h3>.+?</table>.+?</table>"


1 für die Antwort № 2

Da Sie neugierig sind, wie man das mit Regex macht, können Sie stattdessen einen gierigen Quantifizierer mit einem positiven Lookahead verwenden.

preg_match("~<h3>Test</h3>.+(?=<table>)~", $text, $match);
echo $match[0]; //=> "<h3>Test</h3><table></table><table></table>"

Aber ich bin unklar, ob dies tatsächlich leere Tabellen sind, wenn Sie Inhalt zwischen ihnen haben:

preg_match("~<h3>Test</h3>(?:.*?</table>){2}~", $text, $match);

Mit dem richtigen Werkzeug für den Job:

$doc = DOMDocument::loadHTML("
<h3>Test</h3><table></table><table></table><table></table>
");
$xpath = new DOMXPath($doc);
$node  = $xpath->query("//table[last()]")->item(0);
$nnode = $node->parentNode->removeChild($node);
echo $doc->saveHtml();

Arbeitsdemo