php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2005

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 08.05.2005, 18:00  
Benutzer
 
Registriert seit: 31.08.2004
Beiträge: 61
RoDa
Standard Alternativen in preg_replace_callback?

Hallo

Nachdem ich mich nun ein bisschen mit regex beschäftig habe und einiges klappt, bin ich wieder mal auf ein für mich unlösbares Problem gestossen.
Zuerst was geht:
Wörter, die ich mit _b_ beginne und mit _b_ beende, sollen in Blau dargestellt werden. Das habe ich so gemacht:
PHP-Code:
<?php
function farben($treffer)
{
return 
"<font color=\"#0000FF\">".$treffer[1]."</font>";
}
$string="Ein Wort soll in der Farbe _b_Blau_b_ dargestellt werden.";
$regex  "°\b_b_([A-Za-z]+)_b_\b°U"
$farbstring preg_replace_callback($regex"farben"$string); 
echo 
$farbstring;
?>
Klappt. Was aber, wenn ich eine zweite Farbe definieren will, z.B. _r_ für Rot?
Ich habs vergeblich so versucht:
PHP-Code:
<?php
function farben($treffer)
{
return 
"<font color=\"#0000FF\">".$treffer[1]."</font>";
return 
"<font color=\"#FF0000\">".$treffer[2]."</font>";
}
$string="Ein Wort soll in der Farbe _b_Blau_b_ dargestellt werden, ein anderes in _r_Rot_r_.";    
$regex  "°\b_b_([A-Za-z]+)_b_\b°U|°\b_r_([A-Za-z]+)_r_\b°U"
$farbstring preg_replace_callback($regex"farben"$string); 
echo 
$farbstring;
?>
Ich habe mir gedacht, dass ich mit | die beiden Möglichkeiten als Alternative angebe und mit $treffer[1] und $treffer[2] darauf zurückgreifen könnte. Leider erhalte ich folgende Meldung:
Code:
Warning: Unknown modifier '|' in /srv/www/htdocs/web3/html/inips/wiki/farben.php on line 13
Habe ich eine falsche Syntax in $regex? Oder geht das gar nicht, d.h. muss ich den String mehrmals durch preg_replace_callback schicken, um verschiedene Ersetzungen vorzunehmen?

Wenn ichs mehrmals mache, funktionierts sicher. Aber wenns in einmal geht, ist es sicher schneller, oder?

Danke in Voraus.

RoDa
RoDa ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 08.05.2005, 18:03  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

du hast 2 mal nen Delimiter
versuchs mal so


°\b_b_([A-Za-z]+)_b_\b|\b_r_([A-Za-z]+)_r_\b°U
robo47 ist offline  
Alt 08.05.2005, 18:08  
Benutzer
 
Registriert seit: 31.08.2004
Beiträge: 61
RoDa
Standard

Danke, das hilft schon mal ein bisschen weiter. Jetzt erhalte ich:
Code:
Ein Wort soll in der Farbe Blau dargestellt werden, ein anderes in .
Das zweite Wort wird also verschluckt. Offenbar wird zwar _r_Rot_r_ erkannt, aber mit $treffer[2] nicht richtig zurückgegeben. Ich sehe aber leider den Fehler nicht. Weiss vielleicht da jemand weiter?

RoDa
RoDa ist offline  
Alt 08.05.2005, 18:36  
Erfahrener Benutzer
 
Registriert seit: 29.10.2004
Beiträge: 1.781
derHund
Standard

ich würde lieber allgemein nach _\w_ suchen, und in der callback dann auswählen (oder, noch simpler, modifier e verwenden). was ist, wenn du mal _h_ und _l_ und _e_ und _o_ und _z_ verwenden willst ...
__________________
derHund ist offline  
Alt 09.05.2005, 18:28  
Benutzer
 
Registriert seit: 31.08.2004
Beiträge: 61
RoDa
Standard

Danke derHund, das mit dem \w ist ein sehr gute Tipp.
Hat auch alles bestens geklappt, bis ich versuchte, ein Wort mit Umlaut (z. B. "Grün") zu formatieren. So sieht der String aus:

"__g__Grün."

Mit folgendem Suchmuster wollte ich nach dem Wort suchen, das eingeleitet wird vom String "__g__" (bzw. eben "__\w__"):

Code:
\b__(\w)__([A-Z|Ä|Ö|Ü|a-z|ä|ö|ü|ß|0-9]+)\b
Durch die Verwendung von \w erhalte ich in diesem Beispiel "g" zurück und kann dann mit SWITCH auch die gewünschte Formatierung vornehmen, bloss: Vom Wort selbst wird mir bloss "Gr" zurückgegeben. Dasselbe, wenn ichs so formuliere:

Code:
\b__(\w)__([A-ZÄÖÜa-zäöüß0-9]+)\b
Und hier - obschon ich nicht glaube, dass das zum Problem wird - zur Sicherheit der ganze Suchstring inkl. der Alternative, dass noch nach __img__+timestamp+Dateinamenendung gesucht werden soll:

Code:
"°\b__(\w)__([A-ZÄÖÜa-zäöüß0-9]+)\b|__img__([0-9]+.[/gif/|/jpg/|/png/]{3})°U"
Ich habe alle meine Bücher und das Internet durchsucht, checke aber den Fehler nicht. Wie muss ich denn nun den Suchstring richtig definieren, damit ich "Grün" erhalte und nicht bloss "Gr"?

RoDa
RoDa ist offline  
Alt 09.05.2005, 22:40  
Erfahrener Benutzer
 
Registriert seit: 29.10.2004
Beiträge: 1.781
derHund
Standard

generell, und auch wenn du jetzt noch im fortgeschrittenen gepostet hast, würde ich den regexp allgemeiner formulieren, oder auch ausschließend, und anstatt | lieber auf arrays setzen.
__________________
derHund ist offline  
Alt 09.05.2005, 22:43  
Gast
 
Beiträge: n/a
Standard Re: Alternativen in preg_replace_callback?

Zitat:
Zitat von RoDa
Ich habs vergeblich so versucht:
PHP-Code:
<?php
function farben($treffer)
{
return 
"<font color=\"#0000FF\">".$treffer[1]."</font>";
return 
"<font color=\"#FF0000\">".$treffer[2]."</font>";
}
?>
Die zweite Return-Anweisung ist sinnfrei, da sie nie ausgeführt wird.
 
Alt 10.05.2005, 18:01  
Benutzer
 
Registriert seit: 31.08.2004
Beiträge: 61
RoDa
Standard

@derHund: Ich bekenne mich also reumütig und wieder eindeutig als Anfänger. Was auch bedeutet: Ich begreife den Tipp nicht, den du mir gibst. Falls du mir die Sache etwas konkretisieren kannst, werde ichs umzusetzen versuchen. Nichts desto trotz würde ich gerne kapieren, was an meinem Regex falsch ist; auch wenn es einfacher geht: Wo liegt denn der Fehler?

@meikel: Sorry, diesen Teil habe ich bereits korrigiert, weil ich den Fehler bemerkt habe.

Was ich möchte, ist, dass Schüler ohne HTML-Kenntnisse einen Text ganz einfach formatieren können, nämlich indem sie z.B. ein __r__ vor ein Wort setzen. Vgl. dazu das Script syntax.php, das ich in der aktuellen, vollständigen Form nochmal poste (=>$text):
PHP-Code:
<?php
$text 
"Alle __r__Subjekte sollten rot sein (aber nicht __f__fett), alle __g__Prädikate grün und alle __f__Fürwörter fett. Bilder sollen z.B. als __img__1115739647.gif (wobei 1115739647.gif = Dateiname; es kommen nur Nummern als Name vor) angezeigt werden können";

function 
gibfarbe($treffer)
{
    if(
substr($treffer[0],2,3)=="img") return "<img src=\"bilder/".$treffer[3]."\">";// Bild anzeigen, falls Dateiname mit __img__ beginnt
    
switch($treffer[1])
    {
        case 
"b": return "<font color=\"#0000FF\">".$treffer[2]."</font>"; break; //b=blau
        
case "r": return "<font color=\"#FF0000\">".$treffer[2]."</font>"; break; //r=rot
        
case "g": return "<font color=\"#00FF00\">".$treffer[2]."</font>"; break; //g=grün
        
case "f": return "[b]".$treffer[2]."[/b]"; break; //f=fett
    
}
}

$regex  "°\b__(\w)__([A-ZÄÖÜa-zäöüß0-9]+)\b|\b__img__([0-9]+.[/gif/|/jpg/|/png/]{3})\b°U"
$string preg_replace_callback($regex"gibfarbe"$text); 
echo 
$string
?>
Ich hoffe, das Beispiel spricht für sich. (Natürlich soll der $text aus einer DB geholt werden.)
Die Ausgabe ist leider fehlerhaft:
"Subjekte" ist rot.
"fett" ist fett.
Nur das "Pr" bei Prädikate ist grün.
Nur das "F" bei Fürwörter ist fett.
Hier die HTML-Ausgabe (Quelltext):
Code:
Alle <font color="#FF0000">Subjekte</font> sollten rot sein (aber nicht fett), alle <font color="#00FF00">Pr</font>ädikate grün und alle Fürwörter fett. Bilder sollen z.B. als [img]bilder/1115739647.gif[/img] (wobei 1115739647.gif = Dateiname; es kommen nur Nummern als Name vor) angezeigt werden können
Ich habe also ein Problem mit den Umlauten, das ich gerne gelöst hätte. Wie der Quelltext zeigt, liegt es nicht an den htmlentities. Alle Lektüre (Bücher und Internet) hat nicht geholfen.

Also: Sieht jemand den Fehler beim Regex?
@derHund: Kann ich das wirklich allgemeiner formulieren?

RoDa
RoDa ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

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

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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Gibt es Alternativen zur Verschlüsslung mit md5? Bart PHP Tipps 2006 10 19.05.2006 09:01
Summe der Übergaben, alternativen zur Schleife? PHP Tipps 2006 19 09.02.2006 20:15
Warum MySQL, gibt es auch alternativen? Datenbanken 10 03.11.2005 14:57
schnelle alternativen tomson PHP-Fortgeschrittene 2 06.10.2005 11:32
money_format Alternativen unter Windows ? PHP Tipps 2005-2 2 02.10.2005 00:23
Alternativen zu Hyperlinks im php-erzeugten HTML-Code... votec-cougar PHP Tipps 2005-2 4 24.06.2005 07:04
PHPDoc und PHP 5 oder vieleicht Alternativen PHP-Fortgeschrittene 11 18.11.2004 19:05
Alternativen zu Zend SafeGuard (Zend Optimizer) PHP Tipps 2004-2 2 15.11.2004 14:07
file wegen Sicherheitslücke eingeschränkt - Alternativen? zwelch PHP-Fortgeschrittene 3 06.10.2004 18:59

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
preg_replace_callback, php preg_replace_callback html script, preg_replace_callback( alternative, preg_replace_callback case g modifier, html farbstring, \/^[ a-za-zäöüß0-9._-] $/i, html farbstring ändern

Alle Zeitangaben in WEZ +2. Es ist jetzt 13:23 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.