|
|
Synonym

: 09.08.2008 : 3354 : Würzburg
|
| : 10.02.2010, 11:39 : str_replace nur einmal ausführen |
|
|
Ach so meintest Du das. Gehen tut das sehr wohl, das ist klar, dann macht nur das "limit" keinen wirklichen Sinn. Geht würde es auch mit preg_match_all und tokenizer
Aber ein Nachtrag:
Ich würde schon prüfen, ob es strrpos() überhaupt gibt, sonst setzt substr_replace das Ersatzwort immer an den Anfang des Strings (Pos 0) wenn es den Suchbegriff nicht gibt. |
|
| Nach oben |
|
 |
SloMo

: 04.01.2005 : 4027
|
| : 10.02.2010, 12:02 : str_replace nur einmal ausführen |
|
|
Das mit der Pos 0 ist ein guter Punkt. Ich hoffe, der OP liest das. Es ist für die Performance-Sache aber eher unerheblich. Zumal der OP fragt, wie er einen Teilstring ersetzen kann (nicht, wie man ihn ersetzen könnte, falls er existiert). Genau genommen wäre der Check dieser Aufgabenstellung gemäß sogar überflüssig und müsste Punktabzug geben.  |
|
| Nach oben |
|
 |
Synonym

: 09.08.2008 : 3354 : Würzburg
|
| : 10.02.2010, 12:25 : str_replace nur einmal ausführen |
|
|
setzen 5 - Thema verfehlt  |
|
| Nach oben |
|
 |
w3news


: 10.10.2006 : 939 : Berlin
|
| : 10.02.2010, 14:41 : str_replace nur einmal ausführen |
|
|
Das mit der Position null habe ich mit einer if abfrage gelöst:
| Code: |
if ($url !== false)
// Weitermachen... |
Steht so im Manual, was ich dann doch etwas intensiver gelesen habe.
@SloMo
Es kann schon vorkommen, dass der gesuchte String nicht vorkommt, im endgültigen Skript werden mehrere Wörter abgefragt, aber das hatte ich nicht gefragt und konntest du ja auch nicht wissen, da ich das dann doch selber hinbekommen habe. 
MfG Lars
News, Tarife und Mobilfunk: w3news.de
Mobile Datenflatrates |
|
| Nach oben |
|
 |
mgutt


: 08.03.2005 : 3135
|
|
| Nach oben |
|
 |
SloMo

: 04.01.2005 : 4027
|
| : 10.02.2010, 15:04 : str_replace nur einmal ausführen |
|
|
| Code: |
| if ($start===false) throw new Exception('Ungültiger Eingabestring'); |
 |
|
| Nach oben |
|
 |
w3news


: 10.10.2006 : 939 : Berlin
|
| : 10.02.2010, 15:11 : str_replace nur einmal ausführen |
|
|
Die if Abfrage ist in einer While Schleife und so müsste ich noch ein else machen, was ja gar nicht nötig ist. Das Ersetzen war ja nur der eine kleine Teil Aufgabe. 
MfG Lars
News, Tarife und Mobilfunk: w3news.de
Mobile Datenflatrates |
|
| Nach oben |
|
 |
SloMo

: 04.01.2005 : 4027
|
| : 10.02.2010, 15:21 : str_replace nur einmal ausführen |
|
|
Jaja, war ja nur ein Spaß mit der Exception... man kann so einen Fehlerfall (sofern es per Definition einer ist) auf unterschiedliche Arten behandeln. Für Dich wäre wohl die folgende Zeile am kompaktesten:
if ($start===false) continue;
Das erspart Dir den if-Block mit den geschweiften Klammern. Die while-Schleife fährt dann im Fehlerfalle direkt beim while fort. |
|
| Nach oben |
|
 |
w3news


: 10.10.2006 : 939 : Berlin
|
| : 11.02.2010, 18:39 : str_replace nur einmal ausführen |
|
|
Mal noch ne andere Frage, wie kann ich eigentlich das Suchmuster auf exakt stellen?
So ersetzt er ja beim Suchmuster "test" auch "testen",...
MfG Lars
News, Tarife und Mobilfunk: w3news.de
Mobile Datenflatrates |
|
| Nach oben |
|
 |
profo


: 18.01.2007 : 1709
|
| : 11.02.2010, 18:53 : str_replace nur einmal ausführen |
|
|
| Code: |
| $url = preg_replace('/\bTest\b/', 'Test2', $url, 1); |
Das \b ist eine Wortgrenze.
Ceterum censeo facebook esse delendam. |
|
| Nach oben |
|
 |
mgutt


: 08.03.2005 : 3135
|
|
| Nach oben |
|
 |
w3news


: 10.10.2006 : 939 : Berlin
|
| : 11.02.2010, 19:01 : str_replace nur einmal ausführen |
|
|
Wobei da wieder das Problem mit Groß- und Kleinschreibung ist... bei str_replace habe ich einfach str_ireplace genommen und bei preg_replace? Gibt es da auch ne Möglichkeit direkt in der Funktion?
MfG Lars
News, Tarife und Mobilfunk: w3news.de
Mobile Datenflatrates |
|
| Nach oben |
|
 |
mgutt


: 08.03.2005 : 3135
|
| : 11.02.2010, 19:26 : str_replace nur einmal ausführen |
|
|
Modifikator i:
http://www.php.net/manual/de/reference.pcre.pattern.modifiers.php
Also so:
| Code: |
| $url = preg_replace('/\bTest\b/i', 'Test2', $url, 1); |
Mehrere Wörter solltest Du übrigens als Array ohne extra Variable übergeben. Damit erspart man php die extra Zuweisung im Index. Hier meine Autolinksfunktion, da ich fast glaube, dass Du sowas gerade machen willst :
| Code: |
<?php
$text = 'Wort1 Wort2 Wort1.Wort1 Wort2 Wort2, Wort1 Wort2-Wort1 Wort1-Wort2 Wort1';
$text = ltrim(preg_replace(
array(
'#(?<= )(wort1)(?= )#i',
'#\b(wort2)\b#i',
), array(
'<a href="http://www.example.com/" target="_blank">\\1</a>',
'<a href="http://www.example.org/" target="_blank">\\1</a>',
), ' ' . $text));
echo $text;
?> |
In diesem Fall werden alle Wort2 verlinkt. Bei Wort1 werden nur die verlinkt, wo vorher kein Leerzeichen steht und nachher ein Leerzeichen folgt.
Den Vorteil von diesem ganzen wird man erkennen, wenn man weiß, dass \b auch den Bindestrich als Worttrenner akzeptiert und das zu unschönen Ergebnissen führt. Die Erklärung zu \b (word boundary) ist auch etwas wage:
| : |
| A word boundary is a position in the subject string where the current character and the previous character do not both match \w or \W (i.e. one matches \w and the other matches \W), or the start or end of the string if the first or last character matches \w, respectively. |
Ich habe ehrlich gesagt noch nie getestet welche Zeichen alle damit abgedeckt werden.
Dem text habe ich bei der Übergabe ein Leerzeichen angefügt, damit die Regeln bereits beim ersten Wort greifen. Das ganze wird dann mit ltrim() direkt wieder entfernt. Allerdings sieht man in meinem Beispiel, dass das letzte wort1 nicht verlinkt wird. Man müsste also nachher auch ein Leerzeichen übergeben und mit trim() arbeiten, wenn man auch das letzte Wort berücksichtigen möchte.
Hier das Gesamtergebnis:
| : |
| Wort1 Wort2 Wort1.Wort1 Wort2 Wort2, Wort1 Wort2-Wort1 Wort1-Wort2 Wort1 |
Natürlich sollte man den Delimiter hier wieder auf 1 setzen. Ist nur zum Verständnis jetzt weggelassen worden.
» Adsense & Vibrant Alternative
» Ankauf von Communities und Forendomains
Zuletzt bearbeitet von mgutt am 11.02.2010, 19:46, insgesamt 4-mal bearbeitet |
|
| Nach oben |
|
 |
w3news


: 10.10.2006 : 939 : Berlin
|
| : 11.02.2010, 19:41 : str_replace nur einmal ausführen |
|
|
So, dass mit der Groß/Kleinschreibung habe ich hinbekommen:
| Code: |
$suchmuster="#\bTest\b#i";
$url=preg_replace($suchmuster, $ersetzung, $url, 1); |
MfG Lars
News, Tarife und Mobilfunk: w3news.de
Mobile Datenflatrates |
|
| Nach oben |
|
 |
w3news


: 10.10.2006 : 939 : Berlin
|
| : 05.03.2010, 20:01 : str_replace nur einmal ausführen |
|
|
| mgutt hat Folgendes geschrieben: |
Hier meine Autolinksfunktion, da ich fast glaube, dass Du sowas gerade machen willst  |
Ne, wie kommste denn darauf... *erwischt*
Gut, aber eine andere Frage: Wie kann ich verhindern, dass nun die img- Tags zerstört werden, so bald da auch ein Key vorkommt?
MfG Lars
News, Tarife und Mobilfunk: w3news.de
Mobile Datenflatrates |
|
| Nach oben |
|
 |