php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 19-11-2008, 09:29
Olli4
 Registrierter Benutzer
Links : Onlinestatus : Olli4 ist offline
Registriert seit: Mar 2008
Beiträge: 112
Olli4 ist zur Zeit noch ein unbeschriebenes Blatt
Standard preg_replace doppeltes ersetzen verhindern

Hi

Gibt es die möglichkeit?
Wenn ich dies habe:
$suche = array('/test1 test2/i', '/test3/i');
$ersetzen = array(......)

Dann mit preg_replace und das klappt wunderbar.

Kann man eine doppelte ersetzung verhindern? Wenn ich dies habe:
$suche = array('/test1 test2/i', '/test/i');
$ersetzen = array(......)
Wird erst das erste ersetzt und danach aber nochmals test. Kann ich dies irgendwie verhindern? Hätte gerne das wenn test1 test2 vorkommt er es nicht nochmals nachher bei test ersetzt?

Danke für eure tipps.

Gruss

Olli
Mit Zitat antworten
  #2 (permalink)  
Alt 19-11-2008, 09:43
Morpheus2100
 Registrierter Benutzer
Links : Onlinestatus : Morpheus2100 ist offline
Registriert seit: Apr 2004
Beiträge: 385
Morpheus2100 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo Olli,

schau dir mal den LINK an müsste mich Limit gehen!

"Limit
Die maximal mögliche Anzahl von Ersetzungen für jedes Suchmuster in jeder Zeichenkette . Standardmäßiger Wert: -1 (kein Limit). "

Schöne Grüße
Morph
Mit Zitat antworten
  #3 (permalink)  
Alt 19-11-2008, 09:51
Olli4
 Registrierter Benutzer
Links : Onlinestatus : Olli4 ist offline
Registriert seit: Mar 2008
Beiträge: 112
Olli4 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi

Danke dir. Habe es mir mal durchgelesen. So viel ich es verstanden habe, kann ich ihm sagen das er es nur X mal ersetzt.

Ich möchte aber, dass er die suchwörter jedesmal ersetzt wenn sie vorkommen. Das kann 2 mal sein das kann 10 mal sein.

Ich habe ja folgende zwei suchmuster:
test1 test2
test3
Nehmen wir nun ein anderes beispiel:
brauner bär (wird der text formatiert)
bär (wird der text formatiert)
Nun soll er mir im text "ein brauner bär der zu... bär gehört..." beides formatieren. Wenn ich es so habe, formatiert er einmal "brauner bär" und zweimal "bär". Er soll mir aber "brauner bär" nicht nochmals formatieren, da ja "brauner bär" bereits ersetzt wurde mit einer formatierung.

Hoffe ich konnte es einigermasen verständlich erklären.

Gruss

Olli
Mit Zitat antworten
  #4 (permalink)  
Alt 19-11-2008, 11:59
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Hoffe ich konnte es einigermasen verständlich erklären.
Ehrlich gesagt, nein, ich verstehe nur Bahnhof. Habe allenfalls eine dumpfe Ahnung, was du vorhast.

Preg_replace() nimmt selbst keine Mehrfach-Ersetzungen vor, die treten nur auf, wenn du als Suchmuster ode|und Ersetzen-String ein Array angibst. Oft lässt sich die Angabe des Arrays vermeiden, wenn man den Suchstring anders konstruiert. Auch preg_replace_callback() könnte eine Hilfe sein. Aber ohne eine genauere Problembeschreibung kann man leider nur im Nebel stochern.

Kannst du dein Problem nicht konkret beschreiben, ohne abstrakte Beispiele zu konstruieren, die dann irgendwie unlogisch oder unverständlich sind? So wie das hier:

Zitat:
Ich habe ja folgende zwei suchmuster:
test1 test2
test3 ...
Zwei oder Drei?

Zitat:
brauner bär (wird der text formatiert)
bär (wird der text formatiert)
Nun soll er mir im text "ein brauner bär der zu... bär gehört..." beides formatieren. Wenn ich es so habe, formatiert er einmal "brauner bär" und zweimal "bär". Er soll mir aber "brauner bär" nicht nochmals formatieren, da ja "brauner bär" bereits ersetzt wurde mit einer formatierung.
Hüh, Formatierung?

Stell dir folgende Fragen:
Wie lautet dein zu durchsuchender String? (der "Heuhaufen")
Wie lautet das darin zu ersetzende Text-Muster? (die "Stecknadel")
Wie lautet das darin nicht zu ersetzende Text-Muster?
Wie lautet der Ersetzen-String?
... und teile uns deine Antworten mit, falls du selbst keine Lösung findest.

Beim Testen von Regulären Ausdrücken für preg_replace() eignet sich übrigens preg_match_all() gut. Das gibt dir bei gleichem PCRE alle Fundstellen zurück, an denen preg_replace() eine Ersetzung vornehmen würde. Mit var_dump() kannst du dir die Liste anschauen.
Mit Zitat antworten
  #5 (permalink)  
Alt 19-11-2008, 12:21
Olli4
 Registrierter Benutzer
Links : Onlinestatus : Olli4 ist offline
Registriert seit: Mar 2008
Beiträge: 112
Olli4 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

HI

Ich versuchsmal mit dem beispiel von oben. Die sätze ändern sich die ganze zeit also kann ich keine konkreten beispiele nennen da ich noch keines weiss.
$satz = "der braune bär traf im wald auf einen anderen bären";
$suche = array("/braune bär/i", "/bär/i", "/wald/i");
$ersetze = array("<a href="...">braune bär</a>", "<a href="...">bär</a>", "<a href="...">wald</a>");

Die formatierungen gehen zwar noch weiter aber denke für ein klares beispiel dürfte dies reichen.

Nun habe ich mit diesem preg_replace mehrere Probleme:
Der satz würde ja ungefähr nachher so aussehen: "der <a href="...">braune <a href="...">bär</a></a> traf im <a href="...">wald</a> auf einen anderen <a href="...">bär</a>en"
Hier habe ich nun eben die Probleme:
1. Er formatiert mir braune bär zweimal da einmal braune bär eine suche ist und einmal bär was ich gerne verhindern würde.

2. Das weiss ich nicht mal ob es irgendwie gehen könnte. Er formatiert mir bären obwohl das suchwort bär ist. Kann man das machen das er nur das wort bär formatieren würde wenn es ein einzelnes wort ist? Hab zuerst gedacht als suche mach ich einfach "/ bär /i". Nur hier ist das problem wenn es danach oder davor irgendwelche satzzeichen gibt oder es an einem satzanfang ist ohne leerschlag nimmt er es dann auch nicht

Ich hoffe, ich konnte es besser beschreiben. Hab leider etwas mühe damit.

Gruss

Olli

Geändert von Olli4 (19-11-2008 um 12:32 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 19-11-2008, 12:49
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Ich versuchsmal mit dem beispiel von oben. Die sätze ändern sich die ganze zeit also kann ich keine konkreten beispiele nennen da ich noch keines weiss.
Wo kommen die Suchmuster her? Benutzereingaben? Aus irgendeiner vorgefertigten Liste (Datenbank)?

Zitat:
$satz = "der braune bär traf im wald auf einen anderen bären";
$suche = array("/braune bär/i", "/bär/i", "/wald/i");
$ersetze = array("<a href="...">braune bär</a>", "<a href="...">bär</a>", "<a href="...">wald</a>");

Die formatierungen gehen zwar noch weiter aber denke für ein klares beispiel dürfte dies reichen.

Nun habe ich mit diesem preg_replace mehrere Probleme:
Der satz würde ja ungefähr nachher so aussehen: "der <a href="...">braune <a href="...">bär</a></a> traf im <a href="...">wald</a> auf einen anderen <a href="...">bär</a>en"
Hier habe ich nun eben die Probleme:
1. Er formatiert mir braune bär zweimal da einmal braune bär eine suche ist und einmal bär was ich gerne verhindern würde.
'/(braune\s+)?bär/' findet 'bär' und 'braune bär' und spart dir einen Eintrag im "Stecknadel"-Array.

Zitat:
2. Das weiss ich nicht mal ob es irgendwie gehen könnte. Er formatiert mir bären obwohl das suchwort bär ist. Kann man das machen das er nur das wort bär formatieren würde wenn es ein einzelnes wort ist? Hab zuerst gedacht als suche mach ich einfach "/ bär /i". Nur hier ist das problem wenn es danach oder davor irgendwelche satzzeichen gibt oder es an einem satzanfang ist ohne leerschlag nimmt er es dann auch nicht
Es gibt Suchmuster-Klassen für "Buchstaben" und Assertions für Wortgrenzen. Die kranken aber beide daran, dass entweder nicht alle Buchstaben erfasst werden (8-Bit-Modus) oder die Suchmuster-Tabellen sehr groß werden können (UTF-8-Modus).

Es gibt eine Seite zur PCRE-Syntax im PHP-Handbuch. Die ist aber komplett in Englisch, und hat keine verlinkbaren Unterabschnitte. Du musst also auf der Seite nach den englischen Begriffen suchen, wenn du nicht den kompletten Text lesen möchtest (was aber gar nicht so verkehrt wäre).

Die Suchmusterklassen ("character classes"):
\w passt auf "Buchstaben" ("any perl word character")
\W Umkehrung von \w

Die Assertions (dürfen nicht in einer Zeichen-Klasse vorkommen):
\b "Wort"-Grenze ("word boundary")
\B Umkehrung von \b

Streng genommen, sind \b und \B nur wieder Abkürzungen, man kann Wort-Grenzen auch mit '\W\w' (Wortanfang) und '\w\W' (Wortende) prima selber basteln. ;-)

Auf dein bäriges Beispiel angewendet:
'/\Wbär\W/' findet nur noch 'bär', aber nicht 'bären' und auch nicht 'eisbär'.


Zitat:
Ich hoffe, ich konnte es besser beschreiben. Hab leider etwas mühe damit.
Üben, üben, üben! ;-)
Eine gute Problembeschreibung ist oft schon die halbe Lösung.
Mit Zitat antworten
  #7 (permalink)  
Alt 19-11-2008, 13:06
Olli4
 Registrierter Benutzer
Links : Onlinestatus : Olli4 ist offline
Registriert seit: Mar 2008
Beiträge: 112
Olli4 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi

Danke. Werde das mal probieren und mich durch die seite kämpfen. Bin in englisch leider nicht gut aber das wird schon

Gruss

Olli

Geändert von Olli4 (19-11-2008 um 13:25 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

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 are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 02:22 Uhr.