• 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.
 
Werbung:
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.
 
Werbung:
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
 
Werbung:
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