| 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! |
 |

07-06-2005, 18:40
|
|
devcon1
Newbie
|
|
Registriert seit: Jun 2005
Beiträge: 4
|
|
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_word, g_id] auslesen 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)
|

07-06-2005, 23:14
|
|
Coragon Rivito
Master
|
|
Registriert seit: Oct 2002
Ort: Mils/AT
Beiträge: 910
|
|
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
|

07-06-2005, 23:39
|
|
derHund
PHP Master
|
|
Registriert seit: Aug 2003
Ort: Hundehütte
Beiträge: 5.293
|
|
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)
|

08-06-2005, 19:15
|
|
devcon1
Newbie
|
|
Registriert seit: Jun 2005
Beiträge: 4
|
|
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_word, g_id] auslesen 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_word, g_id] auslesen 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)
|

09-06-2005, 10:33
|
|
ankh
Member
|
|
Registriert seit: May 2005
Beiträge: 304
|
|
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>";
|

10-06-2005, 22:49
|
|
devcon1
Newbie
|
|
Registriert seit: Jun 2005
Beiträge: 4
|
|
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)
|

10-06-2005, 23:55
|
|
derHund
PHP Master
|
|
Registriert seit: Aug 2003
Ort: Hundehütte
Beiträge: 5.293
|
|
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)
|

11-06-2005, 00:23
|
|
ankh
Member
|
|
Registriert seit: May 2005
Beiträge: 304
|
|
$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)
|

11-06-2005, 13:07
|
|
devcon1
Newbie
|
|
Registriert seit: Jun 2005
Beiträge: 4
|
|
@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_abfrage, MYSQL_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!
|

11-06-2005, 13:33
|
|
ankh
Member
|
|
Registriert seit: May 2005
Beiträge: 304
|
|
stimmt... hab gestern abend irgendwie 'ne klammer um den ganzen suchausdruck gesehen.
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| 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.
HTML-Code ist aus.
|
|
|
|
PHP News
|