Seite 1 von 2

Reguläre Ausdrücke

Verfasst: 05.07.2006 12:53
von fanrpg
Wäre jemand so lieb und könnte mir einen regulären Ausdruck basteln für eine preg_replace Funktion? :oops:

Überall wo * ist soll gesucht werden der Rest ist fest.

Code: Alles auswählen

<!-- BEGIN * -->
*
<!-- END * -->
Bis ich die regulären Ausdrücke kann, dauert es noch Jahre.
Habs zwar schon selber versucht aber gescheites rausgekommen ist nichts ausser solche Fehlermeldungen:

Code: Alles auswählen

Warning: preg_replace(): Unknown modifier '#'
Also ich habs so versucht:

Code: Alles auswählen

$code = preg_replace('<!-- BEGIN #(*?)# -->#(*?)#<!-- END #(*?)# -->', '', $code);
und so:

Code: Alles auswählen

$code = preg_replace('<!-- BEGIN (*?) -->(*?)<!-- END (*?) -->', '', $code);
und so auch mal...

Code: Alles auswählen

$code = preg_replace('<!-- BEGIN [a-z~0-9] -->[a-z~0-9]<!-- END [a-z~0-9] -->', '', $code);
Aber was gescheites kam nicht raus :oops:

Re: Reguläre Ausdrücke

Verfasst: 05.07.2006 13:31
von Banger
fanrpg hat geschrieben:Wäre jemand so lieb und könnte mir einen regulären Ausdruck basteln für eine preg_replace Funktion? :oops:

Überall wo * ist soll gesucht werden der Rest ist fest.
Was hast Du überhaupt vor? Willst Du den entsprechenden Block komplett rausschmeißen oder durch etwas bestimmtes ersetzen oder gar den Block haben?

Für beide Varianten (Ersetzen und Suchen): probier's mal hiermit:

Code: Alles auswählen

<?php
$cnt = 'das soll <!-- BEGIN Laber -->nicht<!-- END Laber -->stehen bleiben';

echo preg_replace('/<!-- BEGIN (\w+) -->.*<!-- END \1 -->/Us', '', $cnt),"\n";

preg_match('/<!-- BEGIN (\w+) -->(.*)<!-- END \1 -->/Us', $cnt, $r);
print_r($r);
?>
Das erste Beispiel liefert nur den Text um den Block herum zurück, das zweite Beispiel ein Array mit den Matches:
$r[1] enhält den Blocknamen ('Laber')
$r[2] enthält den Text zwischen den Markern ('nicht')

Verfasst: 05.07.2006 13:40
von fanrpg
Was hast Du überhaupt vor? Willst Du den entsprechenden Block komplett rausschmeißen oder durch etwas bestimmtes ersetzen oder gar den Block haben?
Ich will den Block dann komplett raushaben.

Aber danke :) Dein Code funktioniert.
Mit 3 Tutorials die ich bis jetzt gelesen habe war ich schon so weit =>

Code: Alles auswählen

$code = preg_replace('/<!-- BEGIN .* -->.*<!-- END .* -->/i', '', $code);
Er erzeugte zwar keine Fehlermeldung mehr.. aber weg war der Block mit dem Code aber auch nicht.

Verfasst: 05.07.2006 13:44
von Banger
fanrpg hat geschrieben:Mit 3 Tutorials die ich bis jetzt gelesen habe war ich schon so weit =>

Code: Alles auswählen

$code = preg_replace('/<!-- BEGIN .* -->.*<!-- END .* -->/i', '', $code);
Er erzeugte zwar keine Fehlermeldung mehr.. aber weg war der Block mit dem Code aber auch nicht.
Jup, da fehlt der Optionsschalter s, der bewirkt, dass der Punkt auch Zeilenumbrüche erfasst - die ja wahrscheinlich zwischen den beiden Blockmarkern auftreten werden :)

Verfasst: 05.07.2006 13:55
von fanrpg
Danke das hat geholfen mit s funktioniert auch mein Code :)

Ich glaub so langsam versteh ich diese Regulären Ausdrücke.

Habe auch schon den 2. Audruck hingekriegt

Code: Alles auswählen

$this->code = preg_replace('/\{.*\}/i', '', $this->code);
Du bist genial, dank dir :D

Verfasst: 05.07.2006 23:44
von fanrpg
Ich blick da gerade was voll nicht... zum testen wolle ich mal schauen ob ich auch BBCode jetzt hinkriege..

aber irgendwie fühl ich mich gerade irgendwie verarscht..

hier mal die Datei:

Code: Alles auswählen

<?php

$string = 'Dies ist ein [b]einfacher[/b] Test[br] Alles was hier steht [i]muss[/i] [color=#FFFFFF]WEG[/color] [url=http://www.fanrpg.com]Link auf fanrpg.com[/url] [url]http://www.fanrpg.com[/url] <> <>';

function add_bbcode($str)
{
	if( $str )
	{
		// [b] BBCode
		$str = preg_replace('/[{1}b]{1}.*?[{1}\/b]{1}/is', '<strong>$1</strong>', $str);
		
		// [br] BBCode
		$str = str_replace('[{1}br]{1}', "\r\n", $str);
		
		// [i] BBCode
		$str = preg_replace('/[{1}i]{1}.*?[{1}\/i]{1}/is', '<i>$1</i>', $str);
		
		// [color:#123456] BBCode
		$str = preg_replace('/[{1}color:{1}(.*?)]{1}(.*?)[{1}\/color]{1}/is', '<span style="color:$1">$2</span>', $str);
		
		// [url] BBCode
		$str = preg_replace('/[{1}url]{1}(.*?)[{1}\/color]{1}/is', '<a href="$1">$1</a>', $str);
		
		// [url=http://....] BBCode
		$str = preg_replace('/[{1}url=(.*?)]{1}(.*?)[{1}\/url]{1}/is', '<a href="$1">$2</a>', $str);
		
		return $str;
	
	}
}

echo add_bbcode($string);		
?>
Aber als Ausgabe kommt nur so nen Quatsch heraus :cry:

Code: Alles auswählen

D<i></i>st e<i></i>st<span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":"><">$i<"></a>a>span>ng><st<span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":"><">$i<"></a>a>span>ng></st<span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":"><">$i<"></a>a>span>ng><span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":] A"><">$i<"></a>a>span><span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":es was h<i><"><">$i<"></a>a>span>i>]m<a h<a href="ef="ss[">$i<"></a>a><i></i><span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":"><">$i<"></a>a>span><span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":"><">$i<"></a>a>span><span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":] ["></a>"><">$i</a>span><span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":=http:"><">$i<"></a>a>span>/www<span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":fan"><">$i<"></a>a>span>pg<span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":"><">$i<"></a>a>span><span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":m]"><">$i<"></a>a>span><i></i><a h<a href="ef="<span sty">$i<"></a>a>e<a href=""co<a h"></a>ef<a href=""">$i<"></a>a><a h<a href="ef=":"><">$i<"></a>a>span>] [<a h<a href="ef="<span sty">$i<"></a>a>e<a href=""co<a h"></a>ef<a href=""">$i<"></a>a><a h<a href="ef=":"><">$i<"></a>a>span>]http<span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":"><">$i<"></a>a>span>/www<span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":fan"><">$i<"></a>a>span>pg<span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":"><">$i<"></a>a>span><span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":m["><">$i<"></a>a>span><a h<a href="ef="<span sty">$i<"></a>a>e<a href=""co<a h"></a>ef<a href=""">$i<"></a>a><a h<a href="ef=":"><">$i<"></a>a>span>] <> <>
Und ich versteh irgendwie gerade voll nicht, warum das nicht funktioniert :cry:

Weiss das zufällig einer was ich falsch mache?

Verfasst: 06.07.2006 07:59
von MagMo
Hi,

eins deiner Probleme ist, dass du die eckigen Klammern nicht mit einem Backslash geschütz hast.

Bsp.: [abc] sucht nach einem a, einem b oder einem c, aber NICHT nach der Zeichenfolge [abc] wie du es willst.
\[abc\] such nach der Zeichenfolge [abc], dass ist das was du willst.

Zudem ist es ratsam Replace-Code der / enthält nicht durch / einzugrenzen sondern durch #. Dadurch spart man sich das schützen aller /.

Das ersetzen mit einer gefundenen Zeichenfolge funktioniert nicht mit $1.
Erstens musst du die Zeichenfolge, die eingefügt werden soll, durch runde Klammern definieren. In deinem Fall das .*?.
Zweitens erfolgt das Einfügen mittels \n, wobei n die Nummer der Zeichenfolge ist (die definierten Zeichenfolgen durchzählen bei Eins beginnend). In deinem Fall also mit \1.

Also muss dein i-Replace nicht so aufgebaut sein

Code: Alles auswählen

$str = preg_replace('/[{1}i]{1}(.*?)[{1}\/i]{1}/is', '<i>$1</i>', $str);
sondern so

Code: Alles auswählen

$str = preg_replace('#\[i\](.*?)\[/i\]#is', '<i>\1</i>', $str);
Grüße
MagMo

Verfasst: 06.07.2006 16:24
von fanrpg
Danke, hat bestens funkioniert :D

Verfasst: 07.07.2006 21:33
von fanrpg
Eine kleine Frage hätte ich aber noch.. wie kann man einzelne Zeichen auschliessen?

Ich habe das mit Klassen probiert:

Code: Alles auswählen

$str = preg_replace('/\[url\]([^a-z_+,.#%0-9:\/-])\[\/url\]/is', '[url]\1[/url]', $str); // Secure the [url] Tag!
Dies ist der Eingangs String:

Code: Alles auswählen

$str = "[url]http://www.google.de/index,start,site.html[/url] [url]\" onclick=\"this.location(google.de)\"[/url]";
Demnach ist ja der erste Ja Konform und der 2. Nicht, oder täusche ich mich da?

Trotzdem gibt der beide Tags komplett ohne Änderungen aus :(

Code: Alles auswählen

[url]http://www.google.de/index,start,site.html[/url] [url]" onclick="this.location(google.de)"[/url]
Weiss zufällig jemand was ich wieder falsch mache?
Wäre echt nett :(

Verfasst: 07.07.2006 23:17
von MagMo
Hi,
fanrpg hat geschrieben:

Code: Alles auswählen

$str = preg_replace('/\[url\]([^a-z_+,.#%0-9:\/-])\[\/url\]/is', '[url]\1[/url]', $str); // Secure the [url] Tag!
Was willst du damit bezwecken?
fanrpg hat geschrieben:Demnach ist ja der erste Ja Konform und der 2. Nicht, oder täusche ich mich da?
Weder der eine noch der andere String ergeben für den regulären Ausdruck ein Wahr.

1.) In einem regulären Ausdruck steht der Punkt für jedes beliebige Zeichen, wenn du in einer Auswahl nur den Punkt meinst, dann musst du ihn mit \ schützen also:
. - findet jedes Zeichen
\. - findet nur einen Punkt

2.) Ein ^ als erstes Zeichen in den eckigen Klammern verneinen die Zeichenauflistung, Bsp.:
[^a] - findet jedes Zeichen, dass kein a ist
Dein Code oben (vereinfacht) enthält folgendes: [^.] Unter Berücksichtigung von 1.) und 2.) was willst du damit erreichen?

3.) Dein regulärer Ausdruck sucht genau ein Zeichen (nicht mehr und nicht weniger) zwischen [ url] und [ /url], dass nicht gleich a-z usw. ist. Sind zwischen den url's mehr als ein Zeichen vorhanden, dann wars das schon. Wenn du mehr als ein Zeichen zulassen willst, dann musst du das auch angeben.

Du solltest dich eventuell mal ein bischen in die Materie einlesen. :grin:

Grüße
MagMo