Zurück   Flashforum > Flash und Server > PHP und MySQL

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 13-12-2005, 14:05   #1 (permalink)
Neuer User
 
Registriert seit: Jul 2001
Ort: nähe darmstadt...
Beiträge: 101
leidiges thema preg_replace()

hallo,
in meiner verzweiflung wende ich mich nun an euch, da ich weiß, dass hier sehr kompetene leute rumlaufen
ich zitier mein problem mal aus einem anderem forum wo mir aber nicht geholfen wird:

Zitat:
hallo,
hab mir ein script geschrieben, was bestimmte suchmuster in einem string umwandeln soll. als bsp: [ url ]www.test.de[ /url ] (ohne leerzeichen)in einen richtigen html link umwandeln. geht auch sehr gut.
das problem ist ejtzt aber, dass es nicht mehr korrekt angezeigt wird, sobald er mehrere suchmuster in einem string findet.
hier erstmal der code:

PHP-Code:
<?
// $cont = eingangsstring
$text=0;

$suche =     array('!\[url\](.*?)\[/url\]!i',
              
'!\[url=(.*?)\](.*?)\[/url\]!i',
              
'!\[b \](.*?)\[/b\]!i',
              
'!\[em \](.*?)\[/em\]!i'//ohne leerzeichen
              
'!\[u \](.*?)\[/u\]!i',
              
'!\[strike \](.*?)\[/strike\]!i',
              
'!\[email \](.*?)\[/email\]!i',
              
'!\[email = (.*?)\](.*?)\[/email\]!i');
        
for(
$s=0; ;$s++)    { // finde arrayende von $suche
     
if(!$suche[$s])    {
    break;
     }
}

for(
$i=0;$i<=$s;$i++)    { // so lange, wie $i nicht größer als das arrayende von $suche

$match = @preg_match($suche[$i],$cont,$matches);
     if(
$match)      {
    
$ersetze = array('<b><a class="red" href="'.$matches[1].'" target="_blank">'.$matches[1].'</a></b>',
                    
'<b><a class="red" href="'.$matches[2].'" target="_blank">'.$matches[1].'</a></b>',
                    
'<b>'.$matches[1].'</b>',
                    
'<em>'.$matches[1].'</em>',
                    
'<u>'.$matches[1].'</u>',
                    
'<strike>'.$matches[1].'</strike>',
                    
'<b><a class="red" href="mailto:'.$matches[1].'">'.$matches[1].'</a></b>',
                    
'<b><a class="red" href="mailto:'.$matches[2].'">'.$matches[1].'</a></b>');
              
$text = @preg_replace($suche,$ersetze,$cont);
    }
}
if(!
$text)    {
       
$text $cont;
}
// $text = ausgabestring
?>
so angenommen in $cont würde "[ b ]fett[ /b ][ em ]kursiv[/ em ]" (ohne leerzeichen) stehen, gibt er mir folgendes aus:

fettfett


er nimmt sich also den eil zwischen den tags des ersten ergebnisses.
ich such jetzt schon den halben tag nach dem fehler, komme aber keinen meter weiter weil mir mein script total logisch erscheint und ich mir net vorstellen kann, wo der fehler liegt.

gruß
wolle
2 stunden später nach ettlichen weiteren überlegungen:

Zitat:
ok ich bin bei der fehlersuche einen schritt weitergekommen.
das problem ist, dass preg_match() nur suchmuster im stringformat akzeptiert und preg_replace() mixed.
deswegen ist es in meiner script auch total idiotisch, preg_replace() durch eine schleife laufen zu lassen.
muss meine frage umformulieren:
ich will jetzt im ersetze array einfach per reguläre ausdrücke dem programm sagen, dass da wo jetzt $matches[] steht der inhalt von (.*?) aus $suche hin soll.
weiß jetzt nicht inwiefern das zu realisieren ist.
meine kenntnisse in regulären ausdrücken sind auch nur sehr beschränkt, deswegen wäre hier professionelle hilfe sehr gut

gruß
wolle
also ich hoffe mein problem ausreichend dargestellt zu haben und würde mich über eine schnelle lösung sehr freuen

gruß
wolfgang
__________________
Würde ein Architekt so Häuser bauen wie Programmierer Programme, dann könnte ein Specht die ganze Zivilisation zerstören.
secretgamer ist offline   Mit Zitat antworten
Alt 13-12-2005, 15:23   #2 (permalink)
Kaffee...
 
Benutzerbild von x!sign.dll
 
Registriert seit: May 2004
Ort: de/en
Beiträge: 433
mach mal aus !i nen !iU
bedeutet ungreed und heißt soviel, dass der erste match schon ausreicht. Sozusgaen wenn du
PHP-Code:
[url=blabla.com]blabla[/url][b]blabla[/b][url=blabla.com]blabla[/url
dann matched er für den URL String folgendes:
PHP-Code:
blabla[/url][b]blabla[/b][url=blabla.com]blabla 
passiert dir bei !U nicht, da ungreed.
frage mich grade, wieso (.*?) ? warum nicht (.+) ?
dann mach mal vllt nen !s mit rein, damit . auch new lines findet.

zu dem ersetze array (hab den code jetzt nur überflogen): du kannst auf strings per \\1 \\2 etc. zugreifen

sol heißen:
PHP-Code:
preg_replace'!\[url\](.+)\[\/url\]!''\\1'$bla ); 
(.+) ist dann als \\1 vorhanden.

hoffe ich konnte helfen... regexp sind 'n bissl strange... i weiß ^^

und falls du mit funktionen noch weiterarbeiten willst machs so:
PHP-Code:
preg_replace'!\[url\](.+)\[\/url\]!e'"\$this->check_evil('\\1')"$bla ); 
man beachte !e - ist die anweisung dafür, dass im ersetzer alles als php code asugewertet wird, ähnlich wie mit eval(). $this->check_evil() ist dabei eine funktion innerhalb der klasse.

Geändert von x!sign.dll (13-12-2005 um 15:26 Uhr)
x!sign.dll ist offline   Mit Zitat antworten
Alt 13-12-2005, 16:04   #3 (permalink)
jetzt auch in digital!
 
Benutzerbild von .felix.
 
Registriert seit: Jul 2001
Beiträge: 1.047
PHP-Code:
for($s=0; ;$s++)    { // finde arrayende von $suche
     
if(!$suche[$s])    {
    break;
     }

Was soll das denn?
Dafür gibts count()
__________________
felix
.felix. ist offline   Mit Zitat antworten
Alt 13-12-2005, 16:27   #4 (permalink)
Kaffee...
 
Benutzerbild von x!sign.dll
 
Registriert seit: May 2004
Ort: de/en
Beiträge: 433
joah, die brauch er aber sowieso nicht bei preg_match, wie er richtig eingesehn hat ^^
x!sign.dll ist offline   Mit Zitat antworten
Alt 13-12-2005, 16:59   #5 (permalink)
jetzt auch in digital!
 
Benutzerbild von .felix.
 
Registriert seit: Jul 2001
Beiträge: 1.047
Vielleicht würde es helfen wenn ich mir die Posts auch mal durchlesen würde!
__________________
felix
.felix. ist offline   Mit Zitat antworten
Alt 14-12-2005, 07:57   #6 (permalink)
Neuer User
 
Registriert seit: Jul 2001
Ort: nähe darmstadt...
Beiträge: 101
hallo,
na das is doch mal schön da kommt man nachhause und hat gleich kompetente hilfe zu lesen *g*
also ich kann dir nur bedingt folgen.
PHP-Code:
preg_replace'!\[url\](.+)\[\/url\]!''\\1'$bla ); 
und wo kommt das ersetzenmuster dann hin?
vll. preg_replace mit preg_match verwechselt?
und selbst wenn das oben preg_match sein müsste, wie soll dann preg_replace aussehen?
hab mir gestern in meiner verzweiflung eine andere lösung gebastelt.
vielen programmierern wird es jetzt sicher die haare sträuben aber es funzt *g*
ich zeigs einfach mal:

PHP-Code:
// $cont = eingangsstring
$text=0;

$suche = array('!\[url\](.*?)\[/url\]!iUs',
               
'!\[url=(.*?)\](.*?)\[/url\]!iUs',
               
'!\[b\](.*?)\[/b\]!iUs',
               
'!\[em\](.*?)\[/em\]!iUs',
               
'!\[u\](.*?)\[/u\]!iUs',
               
'!\[strike\](.*?)\[/strike\]!iUs',
               
'!\[email\](.*?)\[/email\]!iUs',
               
'!\[email=(.*?)\](.*?)\[/email\]!iUs');

for(
$s=0; ;$s++)    {
    @
preg_match($suche[$s],$cont,$matches[$s]);
    if(!
$suche[$s])    {
        break;
    }
}

$ersetze = array('<b><a class="red" href="'.$matches[0][1].'" target="_blank">'.$matches[0][1].'</a></b>',
                 
'<b><a class="red" href="'.$matches[1][2].'" target="_blank">'.$matches[1][1].'</a></b>',
                 
'<b>'.$matches[2][1].'</b>',
                 
'<em>'.$matches[3][1].'</em>',
                 
'<u>'.$matches[4][1].'</u>',
                 
'<strike>'.$matches[5][1].'</strike>',
                 
'<b><a class="red" href="mailto:'.$matches[6][1].'">'.$matches[6][1].'</a></b>',
                 
'<b><a class="red" href="mailto:'.$matches[7][2].'">'.$matches[7][1].'</a></b>');

$text = @preg_replace($suche,$ersetze,$cont);

if(!
$text)    {
    
$text $cont;
}
// $text = ausgabestring 
das einzige was noch nicht geht, sind mehrere tags ineinander.
also z.b. [b ][em ]text[/em ][/b ]
ohne leerzeichen versteht sich

naja für meinungen und kritik bin ich offen

gruß
wolle
__________________
Würde ein Architekt so Häuser bauen wie Programmierer Programme, dann könnte ein Specht die ganze Zivilisation zerstören.

Geändert von secretgamer (14-12-2005 um 07:59 Uhr)
secretgamer ist offline   Mit Zitat antworten
Alt 14-12-2005, 09:20   #7 (permalink)
Kaffee...
 
Benutzerbild von x!sign.dll
 
Registriert seit: May 2004
Ort: de/en
Beiträge: 433
ja das mit dem ineinander wird so auch nicht gehen (denk ich mal). denn du müsstest folgendes machen:
schreib für jeden preg_replace ne extra funktion.
sprich:
PHP-Code:
function create_url_db$html_string )
{
$db_string preg_replace('!\[url=(.+)\](.*?)\[/url\]!iUs','<b><a class="red" href="\\1" target="_blank">\\2</a></b>'$html_string);
return 
$db_string;
}

// das machste mit jedem BB Code so
// danach:
function create_db_string$html_string )
{
$db_string $this->create_url_db$html_string );
$db_string $this->create_b_db$db_string );
//... etc.
return $db_string;

den $db_string dann als SQL Statement übergeben...
naja du packst das schon...
x!sign.dll ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 14:18 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele