• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

[gelöst][Regular Expressions] Nicht bekannte Gruppe als $n

Status
Für weitere Antworten geschlossen.

Artemis

Neues Mitglied
Moin,

ich habe folgendes Problem.
Ich habe eine Funktion, die ermittelt, ob ein Attribut-Name und ein Attribut-Wert in einem String sind.
Dies geschieht folgendermaßen.
Code:
$regex = '/^'.$regex_für_name.'=("'.$regex_für_wert.'"|'.$regex_für_wert.')$/';
Also kann das name=wert oder name="wert" sein.
Die regex für name und wert, können frei geändert werden, das heißt es kann dort /^[a-z]+$/ aber auch /^(xml:lang|[a-z]+(-[a-z]+|))$/ stehen.

Jetzt möchte ich durch diesen (ersten) regex den wert und den namen herausfiltern.
Das funktioniert für den namen auch einfach:
Code:
preg_replace('/^('.$attribute_name_regex.')=("'.$attribute_value_regex.'"|'.$attribute_value_regex.')$/', '$1', $value)
, da ich da immer die erste Gruppe habe.

Wie kann ich das ganze jedoch für den wert benutzen, bei dem ich nicht weiß, welche Gruppe der ist.
 
inwiefern Gruppe? Welche Gruppe soll der Wert denn haben?
$1 bezieht sich auf $attribute_name_regex $2 auf $attribute_value_regex. ist es das, was du willst?
 
@CrackPod,
ich weiß jetzt wie ich das mache.
Ich ersetzt in $attribute_name_regex jedes Vorkommen von einem ( durch (?:, damit das nicht gespeichert wird.
Mein Problem ist jetzt folgendes.
Ich hab die RegExs schon so aufbereitet, dass sie kein Anfang und Ende mehr haben, also von so: /^(xml:lang|[a-z]+(-[a-z]+|))$/ zu so: (xml:lang|[a-z]+(-[a-z]+|))

Jetzt will ich die RegExs durchgehen und halt wie oben beschrieben ersetze.
Also hab ich folgendes gemacht:
Code:
preg_replace('/([^\\]\(\?:|\()/', '(?:', $wert);
Der Code müsste doch so etwas wie (hsd) durch (?:hsd) ersetzen, so etwas wie \(hallo jedoch nicht.
Jetzt bekomme ich aber folgenden Fehler:
Warning: preg_replace(): Compilation failed: missing terminating ] for character class at offset 14

Was ist da falsch?

Edit:
$2 auf $attribute_value_regex
Wenn aber in $attribute_name_regex ein Ausdruck mit Klammern (SubPattern) vorkommt, dann nicht mehr.
 
mit
preg_replace('/([^\\]\(\?:|\()/', '(?:', $wert);
suchst du doch nichmal nach hsd, um es zu ersetzen?!
 
Das war ein Beispiel.
Es soll (, welche nicht escaped sind, durch (?: ersetzen. Jedoch verstehe ich nicht, warum die fehlermeldung kommt.
 
Die Fehlermeldung sagt, dass dem Patter eine beendende ] fehlt.
Poste mal bitte deinen Code evlt den gesamten bzw den wichtigen Ausschnitt
 
Lol?
Ich hab bei dem Pattern /([^\\]\(\?:|\()/ einfach ein Leerzeichen nach dem \\ gemacht und das umgestellt, und jetzt funktionierts:
/([^\\ ]?)(\(\?:|\()/ Das ganze ersetze ich durch $1(?: und es klappt wunderbar.

@CrackPod
Das war der Code, den ich 2 Posts vor dem hier gepostet habe.
 
ich wusst jetz nur nich, welchen ich nehmen soll aufgrund des Patternsalats :wink:
Gut, dann haben wir das jetz wohl auch geschafft. Bei einem gelösten Thema bitte [gelöst] in den Titel schreiben.
Danke
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben