Mittels regxp auf class-Attribut zugreifen

arkel

Grünschnabel
Hallo zusammen,

ich will aus dem string hier

texttext <div>Inhalt1</div> texttext
texttext <div class="erste">Inhalt2</div> texttext
texttext <div class="zweite">Inhalt3</div> texttext

im ersten div Inhalt1, im zweiten div Inhalt2 und im dritten div Inhalt3 ersetzen (beim zweiten und dritten div brauche ich noch die strings "erste" bzw. "zweite", die als Parameter in meine Funktion einfließen)...

Der String kommt aus einer Textarea und ist in meiner Debugausgabe nicht escaped...

Bisher habe ich folgendes versucht:

$sString = preg_replace_callback('/<div>(.*)<\/div>/s', 'doSmth', $sContent);

Das klappt auch mit der ersten Zeile meines obigen Beispiels. Aber beiden anderen wollen mit dem folgenden Ausdruck einfach nicht matchen:

$sString = preg_replace_callback('/<div( class="(.*)")?>(.*)<\/div>/s', 'doSmth', $sContent);

Liegt das vielleicht am Leerzeichen zwischen div und class? (Die Anführungszeichen habe ich auch schon mit Basckslashes versehen...)

Ich fände es super, wenn jemand eine Idee für mich hätte...

Gruß,
Manu
 
Danke für deine Antwort Markus,
ich werds gleich mal ausprobieren.
Hier bekomme ich dann direkt das gesamte class="erste" denke ich mal (?) - kann ich ja in php aufsplitten...

Gruß,
Manu
 
Da hab ich wohl etwas falsch verstanden. Ich dachte, du wolltest die Werte einfach nur ersetzen.

Neuer Vorschlag:
Code:
@<div(?:[^>]+class="([^"]+)")?[^>]*>(.*)</div>@
 
Danke für den weiteren Tipp, aber es matcht weder mit <div class="xyz"> noch mit <div> :(

Mist, hätte ich gewusst, was das für ein Aufwand ist...
 
Zuletzt bearbeitet:
Ich kann dein Ergebnis nicht nachvollziehen:
PHP:
$testCases = array(
	'<div>foobar</div>',
	'<div class="foo">bar</div>',
	'<div title="..." class="foo">bar</div>',
	'<div class="foo" title="...">bar</div>',
	'<div title="..." class="foo" title="...">bar</div>',
);
foreach( $testCases as $testCase ) {
	if( preg_match('@<div(?:[^>]+class="([^"]+)")?[^>]*>(.*)</div>@', $testCase, $match) ) {
		var_dump(array_map('htmlspecialchars', $match));
	}
}
 
Oh mann, halte mich bitte nicht für total bescheuert:

Dein Beispiel klappt natürlich, jetzt habe ich auch mal meinen Text in das Array eingegeben und es klappt wieder nicht... das einzig unterschiedliche bei mir ist, dass der Inhalt Zeilenumbrüche beinhalten kann...ich suche mal weiter nach dem Ausdruck, der auch diese beinhaltet...
 
Zurück