Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.

str_replace nur einmal ausführen

Ajax, Hijax, Microformats, RDF, Markup, HTML, PHP, CSS, MySQL, htaccess, robots.txt, CGI, Java, Javascript usw.
Synonym
PostRank 10
PostRank 10
Beiträge: 3708
Registriert: 09.08.2008, 02:55

Beitrag von Synonym » 10.02.2010, 11:39

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 :D

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.

Anzeige von ABAKUS

von Anzeige von ABAKUS »


Hochwertiger Linkaufbau bei ABAKUS:
  • Google-konformer Linkaufbau
  • nachhaltiges Ranking
  • Linkbuilding Angebote zu fairen Preisen
  • internationale Backlinks
Wir bieten Beratung und Umsetzung.
Jetzt anfragen: 0511 / 300325-0

SloMo
PostRank 10
PostRank 10
Beiträge: 4880
Registriert: 04.01.2005, 18:26

Beitrag von SloMo » 10.02.2010, 12:02

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. ;)

Synonym
PostRank 10
PostRank 10
Beiträge: 3708
Registriert: 09.08.2008, 02:55

Beitrag von Synonym » 10.02.2010, 12:25

setzen 5 - Thema verfehlt :oops:

Anzeige von ABAKUS

von Anzeige von ABAKUS »

SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


w3news
PostRank 8
PostRank 8
Beiträge: 938
Registriert: 10.10.2006, 23:17
Wohnort: Berlin

Beitrag von w3news » 10.02.2010, 14:41

Das mit der Position null habe ich mit einer if abfrage gelöst:

Code: Alles auswählen

if ($url !== false)
  // Weitermachen...
Steht so im Manual, was ich dann doch etwas intensiver gelesen habe. ;) :D

@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

mgutt
PostRank 10
PostRank 10
Beiträge: 3206
Registriert: 08.03.2005, 13:13

Beitrag von mgutt » 10.02.2010, 14:49

SloMo hat geschrieben:Fazit:
Die PREG-Variante ist gut 50 Prozent langsamer! :P ;)
Ok, ich geb mich geschlagen :lol:

Aber Du hattest keine Bedingung drin, ob überhaupt ersetzt werden kann . Das war gefuscht :P
Ich kaufe Dein Forum!
Kontaktdaten

SloMo
PostRank 10
PostRank 10
Beiträge: 4880
Registriert: 04.01.2005, 18:26

Beitrag von SloMo » 10.02.2010, 15:04

Code: Alles auswählen

if ($start===false) throw new Exception('Ungültiger Eingabestring');
;)

w3news
PostRank 8
PostRank 8
Beiträge: 938
Registriert: 10.10.2006, 23:17
Wohnort: Berlin

Beitrag von w3news » 10.02.2010, 15:11

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

SloMo
PostRank 10
PostRank 10
Beiträge: 4880
Registriert: 04.01.2005, 18:26

Beitrag von SloMo » 10.02.2010, 15:21

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.

w3news
PostRank 8
PostRank 8
Beiträge: 938
Registriert: 10.10.2006, 23:17
Wohnort: Berlin

Beitrag von w3news » 11.02.2010, 18:39

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

profo
PostRank 9
PostRank 9
Beiträge: 1703
Registriert: 18.01.2007, 18:51

Beitrag von profo » 11.02.2010, 18:53

Code: Alles auswählen

$url = preg_replace('/\bTest\b/', 'Test2', $url, 1);
Das \b ist eine Wortgrenze.

mgutt
PostRank 10
PostRank 10
Beiträge: 3206
Registriert: 08.03.2005, 13:13

Beitrag von mgutt » 11.02.2010, 18:57

Und schon hat preg gewonnen :lol:
Ich kaufe Dein Forum!
Kontaktdaten

w3news
PostRank 8
PostRank 8
Beiträge: 938
Registriert: 10.10.2006, 23:17
Wohnort: Berlin

Beitrag von w3news » 11.02.2010, 19:01

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

mgutt
PostRank 10
PostRank 10
Beiträge: 3206
Registriert: 08.03.2005, 13:13

Beitrag von mgutt » 11.02.2010, 19:26

Modifikator i:
https://www.php.net/manual/de/reference ... ifiers.php

Also so:

Code: Alles auswählen

$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: Alles auswählen

<?php
$text = 'Wort1 Wort2 Wort1.Wort1 Wort2 Wort2, Wort1 Wort2-Wort1 Wort1-Wort2 Wort1';
$text = ltrim&#40;preg_replace&#40;
	array&#40;
		'#&#40;?<= &#41;&#40;wort1&#41;&#40;?= &#41;#i',
		'#\b&#40;wort2&#41;\b#i',
	&#41;, array&#40;
		'<a href="http&#58;//www.example.com/" target="_blank">\\1</a>',
		'<a href="http&#58;//www.example.org/" target="_blank">\\1</a>',
&#41;, ' ' . $text&#41;&#41;;
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.
Zuletzt geändert von mgutt am 11.02.2010, 19:46, insgesamt 4-mal geändert.
Ich kaufe Dein Forum!
Kontaktdaten

w3news
PostRank 8
PostRank 8
Beiträge: 938
Registriert: 10.10.2006, 23:17
Wohnort: Berlin

Beitrag von w3news » 11.02.2010, 19:41

So, dass mit der Groß/Kleinschreibung habe ich hinbekommen:

Code: Alles auswählen

$suchmuster="#\bTest\b#i";
$url=preg_replace&#40;$suchmuster, $ersetzung, $url, 1&#41;;
MfG Lars

News, Tarife und Mobilfunk: w3news.de
Mobile Datenflatrates

w3news
PostRank 8
PostRank 8
Beiträge: 938
Registriert: 10.10.2006, 23:17
Wohnort: Berlin

Beitrag von w3news » 05.03.2010, 20:01

mgutt hat geschrieben:Hier meine Autolinksfunktion, da ich fast glaube, dass Du sowas gerade machen willst ;)
Ne, wie kommste denn darauf... ;) *erwischt* :oops:

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

Antworten
  • Vergleichbare Themen
    Antworten
    Zugriffe
    Letzter Beitrag