String ersetzen - Problem mit Groß-/Kleinschreibung
Avalas
- php
0 Felix Riesterer0 Sven Schrodt
0 Sven Schrodt0 seth
Hi,
ich möchte bestimmte Wörter fett formatieren, allerdings sollen nicht nur einzelne Wörter formatiert werden, sondern auch zusammengesetzte Wörter.
Damit es klar wird: ersetzt werden soll "Ball" und "ball".
Ball -> <b>Ball</b>
Fußball -> Fuß<b>ball</b>
Ist ja eigentlich kein Probem; dachte ich:
<?php
$wort = "Ball";
$str = str_ireplace($wort, "<b>$wort</b>", $text);
echo $str;
?>
Aber damit wird aus Ball -> <b>ball</b> (also kleingeschrieben). Mit str_replace wird dagegen Fußball nicht ersetzt.
Gibt es dafür irgendeinen Befehl? Oder muss ich nachträglich prüfen, ob das ersetzte Wort groß oder kleingeschrieben wurde?
Lieber Avalas,
Damit es klar wird: ersetzt werden soll "Ball" und "ball".
Ball -> <b>Ball</b>
Fußball -> Fuß<b>ball</b>$str = str_ireplace($wort, "<b>$wort</b>", $text);
da ist preg_replace meiner Meinung nach besser geeignet, da man dort Referenzen im Audruck erzeugen kann, die man dann in der Ersetzung wieder benutzen kann. Beachte die Runden Klammern um $wort und die escape-te "1" in der Ersetzung:
$wort = "BaLl";
$str = preg_replace('~(?is)('.$wort.')~', '<b>\\1</b>', $str);
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hallo Felix!
da ist preg_replace meiner Meinung nach besser geeignet..
FACK!
Die Bechäftigung der/des OP mit der Dokumentation von str_ireplace
ist IMHO trotzdem sinnvoll - zumal sie/er in der Fragestellung erkennen ließ, das PHP-Manual nicht aufmerksam genug gelesen zu haben.
au relire
Sven
Hi,
vielen Dank für die Antworten. Und ja, ER :) hat das Manual nicht sooooo ausführlich gelesen, aber durchaus so ausführlich, dass ich dort auch das Beispiel gesehen habe; das für mich ohne Erklärung aber leider wenig Aussagekraft hat. Wie sähe das denn aus, wenn ich statt >ball< eine >$variable< benutzen will?
Habe jetzt, da ich das mit str_ireplace nicht durchschaue, mal die preg_replace-Variante genommen. Klappt wunderbar, also nochmals, vielen Dank :)
Nachtrag:
Hier gibts noch eine Anleitung, wie man es schafft, dass Text nur außerhalb von Tags < > ersetzt wird (da sonst ja z.B. Links zerstört werden in denen das zu ersetzende Wort auch vorkommt):
Okay, läuft _fast_ perfekt :)
Ich geh mal davon aus, dass es nicht ganz trivial ist, dass wenn die Variable mehrere Worte enthält, diese alle zu formatieren? Unabhängig davon, wo sie im Text vorkommen!?
gudn tach!
Ich geh mal davon aus, dass es nicht ganz trivial ist, dass wenn die Variable mehrere Worte enthält, diese alle zu formatieren? Unabhängig davon, wo sie im Text vorkommen!?
mit dem zeichen | kann man alternativen angeben.
z.b. preg_replace('/ich gehe (in die schule|ins bett|nach hause)/', 'ich schleiche $1', $str);
meinst du sowas? mehr dazu unter http://de2.php.net/manual/en/reference.pcre.pattern.syntax.php
prost
seth
Ja, im Grunde schon.
Aber ich habe ja nur meine Variable. Diese müsste ich doch erstmal mit $zerlegt = explode(" ", $variable);
in x Wörter trennen.
Dann könnte ich mit
~~~php
foreach($zerlegt as $format)
{
$str = preg_replace($format, "<b>$format</b>", $text);
}
alle Treffer formatieren.
Nur wie schaff ich es, das ganze wieder zusammenzufügen und auszugeben? Einfach ein `echo $str;`{:.language-php} am Ende, und in der Ausgabe ist nur das jeweils letzte Worde in der Variable formatiert, `echo $str;`{:.language-php} in der foreach-Anweisung ergibt logischerweise x identische Ausgaben.
Liebe(r) Avalas,
Dann könnte ich mit
~~~php
foreach($zerlegt as $format)
{
$str = preg_replace($format, "<b>$format</b>", $text);
}
> alle Treffer formatieren.
nö, so nicht, sondern so:
~~~php
$woerter = array("BaLl", "aChteRbahn", "schokoladenEIS");
$muster = '~(is)('.implode('|', $woerter).')~';
$str = preg_replace($muster, '<b>\\1</b>', $str);
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Okay, aber ich habe ja leider keine festen Wörter die zu ersetzen sind, sondern meine Variable, die dynamisch erzeugte Wörter beinhaltet, die dann ersetzt werden sollen.
Liebe(r) Avalas,
Okay, aber ich habe ja leider keine festen Wörter die zu ersetzen sind, sondern meine Variable, die dynamisch erzeugte Wörter beinhaltet, die dann ersetzt werden sollen.
und was war dann an meinem ursprünglichen Posting nicht zufriedenstellend?
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Das klappt ja wunderbar, aber eben nur für ein einzelnes Wort. Wenn die Variable mehr Wörter einthält aber nicht mehr :(
Liebe(r) Avalas,
definiere
Wenn die Variable mehr Wörter einthält
und Dir kann geholfen werden.
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hi,
also über ein Eingabefeld können beliebige Wörter angegeben werden, die hervorgehoben werden sollen (quasi sowas wie eine Suchfunktion). Und diese Wörter werden eben an meine Variable übergeben (mit Leerzeichen getrennt, also z.B. &markieren=ball+kopf
), so dass sie dann in meinem Text hervorgehoben werden können.
Liebe(r) Avalas,
z.B.
&markieren=ball+kopf
das sind Parameter eines URI-Strings! Wenn Du halt immer gleich mit der kompletten Wahrheit herausrücken würdest, dann könnte man Dir auch kompetent helfen. Forumsneulinge scheinen immer wieder zu einer saudämlichen Geheimniskrämerei zu neigen - echt!?!
$woerter = array();
if (isset($_GET['markieren'])) {
$woerter = preg_split('~[\+ ]~', $_GET['markieren']);
}
if (count($woerter) > 0) {
$muster = '~(is)('.implode('|', $woerter).')~';
$str = preg_replace($muster, '<b>\\1</b>', $str);
}
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hi,
nun, ich dachte nicht, worauf das alles hinausläuft ;-)
Am anfang gings mir ja nur um das simple Ersetzen eines Wortes, bis ich gemerkt habe, dass es eben Fälle mit mehreren Worten geben kann.
Und da am Anfang alles so gut geklappt hat, dachte ich es wäre auch alles klar. Dass ich mich so unklar ausgedrückt habe, war mir nicht bewusst - sorry.
Leider funktioniert das ganze aber noch immer nicht so recht, drum hol ich lieber noch mal aus :-) (wenn hier jetzt aber alle die Waffen niederstrecken, nehm ichs auch keinem übel)
Denn das Problem was ich jetzt habe: wo ist in deinem Code der Text, der die zu ersetzenden Wörter enthält? Ich kann ja nicht sagen ersetze Wort abc und Wort xyz, solange gar kein Text da ist.
Vorgesehen war das ganze so (für ein Wort klappt das ja auch schon einwandfrei):
if(isset($_GET['markieren'])
{
$treffer = htmlentities($_GET['markieren']);
}
// Datei öffnen und Inhalte speichern
$datei = "regeln.php";
$inhalt = file_get_contents($datei);
$s = $treffer; // zu ersetzender Begriff
$t = $inhalt; // Text in dem der zu ersetzende Begriff vorkommt
// Syntax zum Ersetzen nur außerhalb von Tags
$str = preg_replace("/((<[^>]*)|$s)/ie", '"\2"=="\1"? "\1":"<span class=\"markieren\">\1</span>"', $t);
// Ausgabe
echo $str;
Leider weiß ich nicht, wie ich jetzt in deinem Code die ausgelesene Datei (regeln.php) unterbringe.
Hallo
Leider funktioniert das ganze aber noch immer nicht so recht, drum hol ich lieber noch mal aus :-) (wenn hier jetzt aber alle die Waffen niederstrecken, nehm ichs auch keinem übel)
Denn das Problem was ich jetzt habe: wo ist in deinem Code der Text, der die zu ersetzenden Wörter enthält? Ich kann ja nicht sagen ersetze Wort abc und Wort xyz, solange gar kein Text da ist.
Wenn du den relevanten Code aus Felix' Posting nicht gelöscht hättest, würde sich die Frage nicht stellen.
z.B.
&markieren=ball+kopf
das sind Parameter eines URI-Strings!
$woerter = array();
if (isset($_GET['markieren'])) {
$woerter = preg_split('~[+ ]~', $_GET['markieren']);
}
Prüft, ob `$_GET["markieren"]`{:.language-php} existiert, bei Existenz erfolgt Auftrennung am "+". Die zu markierenden Begriffe liegen hernach im Array `$woerter`{:.language-php} vor.
gegen:
> Vorgesehen war das ganze so (für ein Wort klappt das ja auch schon einwandfrei):
>
> ~~~php
if(isset($_GET['markieren'])
> {
> $treffer = htmlentities($_GET['markieren']);
> }
Tschö, Auge
Hallo
$woerter = array();
if (isset($_GET['markieren'])) {
$woerter = preg_split('~[+ ]~', $_GET['markieren']);
}
>
> Prüft, ob `$_GET["markieren"]`{:.language-php} existiert, bei Existenz erfolgt Auftrennung am "+". Die zu markierenden Begriffe liegen hernach im Array `$woerter`{:.language-php} vor.
Ergänzung (bevor das wieder verloren geht):
~~~php
if (count($woerter) > 0) {
$muster = '~(is)('.implode('|', $woerter).')~';
$str = preg_replace($muster, '<b>\\1</b>', $str);
}
Diese Funktion (ebenfalls aus Felix' Posting) prüft, ob im Array $woerter
mehr als 0 Werte drin sind. Trifft dies zu, werden sie per implode
zu einer Zeichenkette verschmolzen. Die einzelnen Begriffe sind dann durch die Pipe "|" getrennt ("ball|kopf
"), genau so, wie du sie danach im regulären Ausdruck zum Markieren der Begriffe im Text brauchst.
Tschö, Auge
Con ta bai!
Ich geh mal davon aus, dass es nicht ganz trivial ist, dass wenn die Variable mehrere Worte enthält, diese alle zu formatieren? Unabhängig davon, wo sie im Text vorkommen!?
Du meinst, Du willst nicht nur "Ball", sondern im selben Durchlauf auch gleich "Topf" und "Achterbahn" ersetzen? Dafür genügt eine Oder-Verknüpfung der Wörter:
$wort = '(Ball)|(Topf)|(Achterbahn)';
Der Rest bleibt unverändert, denn die Referenz enthält ja sowieso das gefundene Wort - egal, ob es eine Variante von "Ball" oder ein ganz anderes ist.
Viele Grüße vom Længlich
Merhaba!
Bin gerade mal seths Link gefolgt: Die Klammern sind unnötig. Statt
$wort = '(Ball)|(Topf)|(Achterbahn)';
also lieber
$wort = 'Ball|Topf|Achterbahn';
Viele Grüße vom Længlich
Salut Avalas!
probiere bitte mal das:
<?php
echo $bodytag = str_ireplace("%ball%", "<b>ball</b>", "Schalke spielt:Fuss%ball%");
?>
Und danach möchtest du das bestimmt lesen:
http://de.php.net/manual/de/function.str-ireplace.php
au relire
Sven
gudn tach!
probiere bitte mal das:
<?php
echo $bodytag = str_ireplace("%ball%", "<b>ball</b>", "Schalke spielt:Fuss%ball%");
?>
warum?
> Und danach möchtest du das bestimmt lesen:
> <http://de.php.net/manual/de/function.str-ireplace.php>
aeh, er hat doch im aufruf nichts falsch gemacht, oder? warum soll der OP also das manual bzgl. dieser funktion lesen, wenn die hier gar nix bringt? oder hab ich was ueberlesen?
prost
seth