ebiz-webhosting
- Ad -
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! Post your PHP questions here!

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 07-06-2005, 18:40
devcon1
 Newbie
Links : Onlinestatus : devcon1 ist offline
Registriert seit: Jun 2005
Beiträge: 4
devcon1 ist zur Zeit noch ein unbeschriebenes Blatt
Question preg_match: Einzahl/Mehrzahl berücksichtigen

Hallo zusammen,

folgenden Code nutze ich, um Datenbankinhalte in ein Array einzulesen, anschließend vorhandenen Content und Datenbankinhalte mittels preg_match auf Übereinstimmung zu untersuchen. Bei Übereinstimmung gibt's ein preg_replace.

Dantenbank-Inhalte (Lexikon)
1. ID ($g_id)
2. Wort ($g_word)
3. Bedeutung/Erläuterung


PHP-Code:
$inhalt "<zu durchsuchender Original-Content>";
while(
datenbank [g_wordg_idauslesen und in array packen
{
$suche_str "/\b".$g_word."(en|n)\b/i\n";
$ersetze_str "<a href='glossar.php?id=$g_id'>$g_word</a>";

if (
preg_match($suche_str$inhalt))
    {
$inhalt preg_replace($suche_str$ersetze_str$inhalt);
    }

Bei den Fundstellen in $inhalt sollen Begriffe sowohl in Einzahl als auch Mehrzahl berücksichtigt werden, wobei in der Datenbank aus Platzgründen natürlich nur ein Begriff von beiden stehen soll - günstigstenfalls nur in der Einzahl.

Bsp also.:
DB Inhalt: Krone
Funstelle: Krone oder Kronen.
preg_match soll individuell ersetzen
<a href='glossar.php....>Krone</a> ODER <a href='glossar.php....>Kronen</a>

Die Fundstellen werden bei den Patterns in $suche_str zwar wie gewollt berücksichtigt, jedoch wird die Fundstelle derzeit logischerweise durch preg_replace mit dem Link per DB Inhalt ($g_word) ersetzt.

Nun meine Frage: Wie kann ich es erreichen, dass abhängig vom Fund der Link wie oben in Einzahl oder Mehrzahl erzeugt wird? Bestimmt muss da noch an den Patterns gefeilt werden und im Link die Var $g_word gegen $inhalt ausgetauscht werden. Davor muss die Var $inhalt aber nochmal durch ein $preg_match oder $preg_replace gejagt werden, hmn?

Hab mich im diversen Foren durchgeforstet aber leider keine eindeutigen Infos gefunden. In Sachen Patterns befinde ich mich auch noch auf relativem Neuland,

Bitte daher um eure Unterstützung.
Herzlichen Dank im Voraus und Grüßle

Andreas

EDIT: Backslashes werden im Code (Patterns) nicht angezeigt, sind aber vorhanden.

Geändert von devcon1 (07-06-2005 um 18:45 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 07-06-2005, 23:14
Coragon Rivito
 Master
Links : Onlinestatus : Coragon Rivito ist offline
Registriert seit: Oct 2002
Ort: Mils/AT
Beiträge: 910
Coragon Rivito ist zur Zeit noch ein unbeschriebenes Blatt
Coragon Rivito eine Nachricht über ICQ schicken Coragon Rivito eine Nachricht über AIM schicken Coragon Rivito eine Nachricht über Yahoo! schicken
Standard

erkär mir lieber mal warum du zuerst preg_match() verwendest und dann nochmal preg_replace() ..

zu deiner frage: im ersetze_str hast du auch nur g_word angegeben, nicht das fundstück als solches ..
__________________
mfg,
Coragon
Mit Zitat antworten
  #3 (permalink)  
Alt 07-06-2005, 23:39
derHund
 PHP Master
Links : Onlinestatus : derHund ist offline
Registriert seit: Aug 2003
Ort: Hundehütte
Beiträge: 5.293
derHund ist zur Zeit noch ein unbeschriebenes Blatt
Standard Re: preg_match: Einzahl/Mehrzahl berücksichtigen

Zitat:
Nun meine Frage: Wie kann ich es erreichen, dass abhängig vom Fund der Link wie oben in Einzahl oder Mehrzahl erzeugt wird?
setze klammern um den zu findenen ausdruck und verwende backreferences, um draufzuzugreifen.
Zitat:
EDIT: Backslashes werden im Code (Patterns) nicht angezeigt, sind aber vorhanden.
in den code-tags geht es ...

btw: atlanten, globen, ... der hund, des hundes,
__________________
Die Zeit hat ihre Kinder längst gefressen: hund (back in black) | ??? | ??? | ...

Geändert von derHund (07-06-2005 um 23:43 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 08-06-2005, 19:15
devcon1
 Newbie
Links : Onlinestatus : devcon1 ist offline
Registriert seit: Jun 2005
Beiträge: 4
devcon1 ist zur Zeit noch ein unbeschriebenes Blatt
Standard Re: Re: preg_match: Einzahl/Mehrzahl berücksichtigen

Zitat:
Original geschrieben von derHund
setze klammern um den zu findenen ausdruck und verwende backreferences, um draufzuzugreifen.
Ich versuchte es nun w.f (Klammern wurden ja schon vorher verwendet (en|n):
PHP-Code:
$inhalt "<zu durchsuchender Original-Content>";
while(
datenbank [g_wordg_idauslesen und in array packen
{
$suche_str "\\/b".$g_word."(en|n)\\1\\b/i\n";
$ersetze_str "<a href='glossar.php?id=$g_id'>$g_word</a>";

if (
preg_match($suche_str$inhalt))
    {
$inhalt preg_replace($suche_str$ersetze_str$inhalt);
    }

ODER auch mit:

PHP-Code:
$inhalt "<zu durchsuchender Original-Content>";
while(
datenbank [g_wordg_idauslesen und in array packen
{
$suche_str "\\/b(".$g_word."(en|n))\\2\\b/i\n";
$ersetze_str "<a href='glossar.php?id=$g_id'>$g_word</a>";

if (
preg_match($suche_str$inhalt))
    {
$inhalt preg_replace($suche_str$ersetze_str$inhalt);
    }

Soweit so gut, wurde von mir sicher nicht korrekt angewendet, jedoch habe ich damit lediglich die preg_match Patterns modifiziert, ohne die Ausgabe zu via replace verändern. Wie ändere ich die Ausgabe bzw wie übergebe ich wo Backrefences an preg_replace?

Könntest du anhand meines Codes mit einem Beispiel zur Verdeutlichung dienen?
Ich komme mit der Anwendung von Patterns, Backreferences und Unterausdrücken derzeit noch etwas durcheinander. Eine Erläuterung auf Basis meines Codes würde mir hier sehr helfen.

Vielen Dank!

p.s.
Mit "Backslashes werden nicht angezeigt" meine ich meinen Code oben.
Im Edit-Modus alles vorhanden: $suche_str = "\/b".$g_word."(en|n)\1\b/i\n";

im View-Modus (jedenfalls bei mir -> Firefox) wird angezeigt: $suche_str = "/b".$g_word."(en|n)1b/i\n";

Die Backslahes werden bis auf \n nicht angezeigt.
EDIT: Wenn ich \\ eingebe, wird er angezeigt - ok - im Edit Modus irritierend aber es funktioniert wenigtens in der Ansicht.


Geändert von devcon1 (08-06-2005 um 19:28 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 09-06-2005, 10:33
ankh
 Member
Links : Onlinestatus : ankh ist offline
Registriert seit: May 2005
Beiträge: 304
ankh ist zur Zeit noch ein unbeschriebenes Blatt
ankh eine Nachricht über ICQ schicken
Standard

du setzt keine Backreference in den ersetzen teil sondern immer noch die original variable.

probier mal so:

PHP-Code:
$ersetze_str "<a href='glossar.php?id=$g_id'>$1</a>"
Mit Zitat antworten
  #6 (permalink)  
Alt 10-06-2005, 22:49
devcon1
 Newbie
Links : Onlinestatus : devcon1 ist offline
Registriert seit: Jun 2005
Beiträge: 4
devcon1 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von ankh
du setzt keine Backreference in den ersetzen teil sondern immer noch die original variable.

probier mal so:

PHP-Code:
$ersetze_str "<a href='glossar.php?id=$g_id'>$1</a>"
Dein Beispiel bringt mich nicht weiter.
Wo wird die Variable $1 definiert?
Eine Backreferenz wie \1 wird zur Variable?!

Drücke ich mich wirklich so missverständlich aus?

Der Link
PHP-Code:
$ersetze_str "<a href='glossar.php?id=$g_id'>$g_word</a>"
soll den gefundenen Strings im Original-Content komplett ersetzen.

D.h. aus normalem Text "Krone" wird bspw. "<a href='glossar.php?id=55'>Krone</a>"

Sollte im Text nun "Kronen" gefunden werden, soll dies autom. gemäß den Backreferences durch "<a href='glossar.php?id=55'>Kronen</a>" ersetzt werden - in der Datenbank ist jedoch nach wie vor nur "Krone" definiert.

"Krone" oder "Kronen" im Text zu finden, ist mittels der Patterns in $suche_str nicht das Problem. Einzig meine Frage: Wie wende ich Backrefences in $suche_str an und wie übergebe ich diese an $ersetze_str ??

Ich möchte hier um himmelswillen kein fertiges Script definiert haben - ich versuche lediglich zu lernen, wie man Patterns und Backreferences korrekt anwendet.

Sollte ich die Patterns in meinem Code falsch anwenden, so teilt mir das bitte mit und versucht, dies aussagekräftig zu verdeutlichen. Mit halben Sätzen/Anmerkungen ist mir leider gar nicht geholfen.

Nobody's perfect - raten bringt aber auch nichts.

Vielen Dank.

Geändert von devcon1 (10-06-2005 um 22:57 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 10-06-2005, 23:55
derHund
 PHP Master
Links : Onlinestatus : derHund ist offline
Registriert seit: Aug 2003
Ort: Hundehütte
Beiträge: 5.293
derHund ist zur Zeit noch ein unbeschriebenes Blatt
Standard

hmm,

also, hier erstmal nen ansatz für ein einfaches preg_replace ...
http://pcre.nophia.de/evaluate/a2c61...dex.php#output

du mußt es noch anpassen, um nicht z.b. kronentiger auch zu ersetzen ...

dann erstellst du dir ein array, in dem alle pattern sind, und eines, in dem alle ersatzstrings sind ... preg-replace kann auch arrays verarbeiten.

das wars schon.

obwohl sprechende urls natürlich schöner wären ...

sollte ich morgen früh noch einigermaßen fit sein , bastel ich dir noch was konkretes, ... falls du bis dahin noch nichts hast.
__________________
Die Zeit hat ihre Kinder längst gefressen: hund (back in black) | ??? | ??? | ...

Geändert von derHund (10-06-2005 um 23:58 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 11-06-2005, 00:23
ankh
 Member
Links : Onlinestatus : ankh ist offline
Registriert seit: May 2005
Beiträge: 304
ankh ist zur Zeit noch ein unbeschriebenes Blatt
ankh eine Nachricht über ICQ schicken
Standard

$1 oder \1 sind ( derHund möge mich verbessern, wenn's falsch ist) equivalent in php.

Will sagen, deine Backreference, definiert durch runde Klammerpaare werden entsprechend der Reihenfolge ihres Auftretens als Backreference $1 - $9 gespeichert. (respektive \1-\9).
$1 wird also implizit, durch das setzen der runden Klammern gesetzt und steht dir somit innerhalb der preg_replace Anweisung als Backreference zur Verfügung.

bringt dich das so weiter?
EDIT:
nebenbei... es gibt noch wesentlich mehr plural suffixe (auto(s), schiff(e), baum(bäume) etc) wär vielleicht Sinnvoll, die RegEx a priori so zu erstellen, dass sie da auch greift.

hmm..
am retten, dem Dativ und am rocken, dem Plural


Geändert von ankh (11-06-2005 um 00:32 Uhr)
Mit Zitat antworten
  #9 (permalink)  
Alt 11-06-2005, 13:07
devcon1
 Newbie
Links : Onlinestatus : devcon1 ist offline
Registriert seit: Jun 2005
Beiträge: 4
devcon1 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

@derHund
dein Link ist eine Bereichung, um die Zusammenhänge an Hand sofortiger Ausgaben auszutesten. Ich werde mich ausgiebig damit beschäftigen.

Gehen wir einmal von deinem Optimierungsvorschlag aus, Patterns und Erzatz je in einem Array abzulegen: Beim Ersatz geschieht dies bereits durch eine Datenbankabfrage:
PHP-Code:
while($glossar_inhalt mysql_fetch_array($glossar_abfrageMYSQL_ASSOC))
{
... 
Patterns
... preg_match
... preg_replace

Diese DB Abfrage mit anschließendem Vergleich folgt in ausgewählten Scripten jeweils nach Definition der Content-Variable und vor Ausgabe des Original-Content.
Ich ging bislang davon aus, dass die Definitionen von preg_match und _replace fest vorgegeben sind:

preg_match á la <Patterns-Beginn>"Ersatz"<PatternsOptionen><PatternsEnde>
preg_replace á la ($suche_nach (DB-Array), $ersetze_mit (preg_match Ergebnis), $ersetze_in (Original-Content))

Wo ich jetzt noch hängen bleibe: Wie realisiere ich bei meinem Anliegen bestenfalls die Kombination mit Patterns in einem Array?


@ankh
Die Übergabe einer Backreference in diesem Fall habe ich jetzt denke mal begriffen. Gehe ich recht in der Annahme, dass mit übergebener Backreference \1 der Link im jetzigen Stadium w. f. lauten müsste?
PHP-Code:
$ersetze_str "<a href='glossar.php?id=$g_id'>$g_word$1</a>"
Mal ganz abgesehen von den Optimierungen, die noch anstehen....

Dass die regulären Ausdrücke dringend einer Erweiterung vom simplen (en|n) bedürfen, ist korrekt. Mein Beispiel sollte erst einmal der Verdeutlichung dienen.

Ich probiere nun intensiv, das Erfahrene zu verarbeiten. Ich lasse euch das Ergebnis wissen. Natürlich bin ich dankbar, wenn ihr noch weitere Tipps geben könnt.

Vorab herzlichen Dank an euch beide!
Mit Zitat antworten
  #10 (permalink)  
Alt 11-06-2005, 13:33
ankh
 Member
Links : Onlinestatus : ankh ist offline
Registriert seit: May 2005
Beiträge: 304
ankh ist zur Zeit noch ein unbeschriebenes Blatt
ankh eine Nachricht über ICQ schicken
Standard

stimmt... hab gestern abend irgendwie 'ne klammer um den ganzen suchausdruck gesehen.
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

MariaDB 5.5 veröffentlicht
MariaDB 5.5 veröffentlichtDie freie MySQL-Alternative MariaDB wurde in der stabilen Version 5.5.23 veröffentlicht und soll einige Verbesserungen gegenüber Oracles Communityversion von MySQL mitbringen.

16.04.2012 | Berni

Deutsche Yii Framework Community
Deutsche Yii Framework CommunitySeit dem 19.03.2012 gibt es für die Yii PHP Framework Community ein deutsches Zuhause.

20.03.2012 | dhcomputer

 

Aktuelle PHP Scripte

Advanced Login ansehen Advanced Login

Login-System und Kundenverwaltung, die sich spielend leicht in bestehende Webseiten einbauen lässt und einen enormen Funktionsumfang bietet. Ihre eigene Webseite muss mit Advanced Login nicht umständlich an ein fertiges System angepasst werden.

25.05.2012 Madden | Kategorie: PHP/ Kundenverwaltung
BROM CMS/BelCal 3 ansehen BROM CMS/BelCal 3

Spezielles CMS für Betreiber von Ferienwohnungen. Komplette Seitenerstellung online, Verwaltung mehrerer Objekte, Reservierungssystem mit sofortigem Abgleich im Belegungskalender und vieles mehr bietet dieses Content Management System.

25.05.2012 belcal2 | Kategorie: PHP/ CMS
belbit LiveSupport Script ansehen belbit LiveSupport Script

Schnellen und unkomplizierten Support im LiveSupport-Chat anbieten. Ohne Datenbank und in wenigen Sekunden installiert.

24.05.2012 EichbaumMedia | Kategorie: PHP/ Chat
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 08:52 Uhr.