Hilfe! Reguläre Ausdrücke

Carrear

Erfahrenes Mitglied
Hi Leutz,

wer kennt sich denn gut mit regulären Ausdrücken aus? Ich muss etwas ganz bestimmtes rausfiltern. Ich zeige euche ersteinmal die HTML Ausgabe:

HTML:
<ul class="nice-menu nice-menu-down" id="nice-menu-1">
	<li class="menu-1"><a href="/" title="" class="active">START</a></li>
	<li class="menu-2 menuparent"><a href="/?q=das-bin-ich">PERSON</a>
		<ul>
			<li class="menu-3"><a href="/?q=das-bin-ich" title="">DAS BIN ICH</a></li>
			<li class="menu-4"><a href="/?q=lebenslauf">LEBENSLAUF</a></li>
		</ul>
	</li>
	<li class="menu-5 menuparent"><a href="/?q=meine-kunst">KUNST</a>
		<ul>
			<li class="menu-6"><a href="/?q=meine-kunst" title="">BILDER</a></li>
			<li class="menu-7"><a href="/?q=cdu-landesvorsitz">SKULPTUREN</a></li>
		</ul>
	</li>
	<li class="menu-8"><a href="/?q=contact" title="">KONTAKT</a></li>
</ul>

Ihr seht, dass in der ersten Ebene der verschachtelten Liste immer li-Objekte mit der Klasse 'menuparent' sind. Ich will, dass immer der auf diesen li-Tag folgende a-Tag herausgefiltert wird (dementsprechend auch der schließende a-Tag. Erzielen möchte ich, dass die erste Ebene der Liste nicht verlinkt ist.

Was der Reguläre Ausdruck also im Prinzip aussagen soll:
Suche 'menuparent' und filtere das nächste '<a' bis '>' und das darauf folgende '</a>' (nicht das dazwischen).


Wäre jemand so lieb mir das zu verfassen?

Viele Grüße
 
Geht sicher auch noch besser
Code:
/<li[^>]+class="[^"]*menuparent[^"]*"[^>]*>(<a[^>]+>).+(<\/a>)/iU
 
Es scheint nicht 100% richtig zu sein. Kurz der Code und dann meine Erläuterung:

PHP:
<?php 
$output = render($page['mobile_menu']);
$regex ='/<li[^>]+class="[^"]*menuparent[^"]*"[^>]*>(<a[^>]+>).+(<\/a>)/iU';
$output = str_replace( $regex, "", $output );
print $output; 
?>

Ersetze ich die Zeile

PHP:
$output = str_replace( $regex, "", $output );

durch

PHP:
$output = str_replace( "START", "ENDE", $output );

dann funktioniert das - ich denke also, dass er innerhalb der Variable keinen String findet der dem regulären Ausdruck entspricht. Wärst du so nett noch einmal drüber zu schauen?
 
Ah, du brauchst es für einen replace und nicht für einen preg_match_all().

So oder so. str_replace ist OHNE regulären Ausdrücken. preg_replace() ist mit.

Allso, für einen replace muss man die AUswahl umdrehen und alles auswählen was NICHT ersetzt werden soll
PHP:
$pattern = '/(<li[^>]+class="[^"]*menuparent[^"]*"[^>]*>)<a[^>]+>(.+)<\/a>/iU';
$replace = '\1\2';
$output = preg_replace($pattern, $replace, $output);
 
Ganz super ! Ich musste zwar noch etwas rumbasteln, aber das lag nun nicht mehr am regulären Ausdruck. Sag mal dieses \1\2 klappt das immer? Das kannte ich gar nicht :D
 
\1\2 klappt natürlich nur in desem Fall wo ich im Regulären Ausdruck 2 Klammernpaare haben.
\1 ist der gefundene Inhalt der ersten Klammer. \2 entsprechend er Inhalt der 2ten Klammer. Hätten wir 3Klammern, dann müssten wir auch \3 noch nehmen....etc.
Was im Ausdruck ist, aber nicht in den Klammern steht wird so weggeworfen

Code:
(<li[^>]+class="[^"]*menuparent[^"]*"[^>]*>)<a[^>]+>(.+)<\/a>

-- 1. Klammer: Der li-Tag in dem 'menuparent' als class vorkommt
(<li[^>]+class="[^"]*menuparent[^"]*"[^>]*>)

-- Wird weggeworfen: der a-Tag
<a[^>]+>

-- 2 Klammer: Alles bis zum End-a-Tag
(.+)

-- Wird weggeworfen: End-a-Tag
<\/a>
 
Zurück