regulären ausdruck (PHP) umkehren. wie?

L

loginvergessen

Aktives Mitglied
Thread Starter
Dabei seit
03.05.2006
Beiträge
313
Reaktionspunkte
15
hallo,

ich möchte einen variableninhalt per regex (PHP) überprüfen.
als beispiel-inhalt nehmen wir mal den string
"awdasdfe89woeir366joweif55re27jowee98ijrow".

es soll nun alles rausgefiltert werden, was sich als kleines "e", gefolgt von genau 2 Ziffern darstellt. das klappt auch soweit, mit
/[e]\d{2}/
erhalte ich 3 treffer ('e89', 'e27' und 'e98').

wie aber stelle ich es an, dass mir alles gematcht wird,
das NICHT dem muster "e--" entspricht?

/[^e{1}\d{2}]/
lässt u.a. auch "366" und "ee98" durch - getestet mit http://rubular.com/
 
Indem Du genau anders auf das gleiche Abfrageresultat reagierst ( oder ich verstehe Dich da falsch). Für regex-Prüfungen kann man ja ereg() verweden:

http://de.php.net/manual/en/function.ereg.php


Als Resultat der Funktion steht da:
Returns the length of the matched string if a match for pattern was found in string , or FALSE if no matches were found

also müßtest Du wohl abfragen a la

if (! ereg(...)) {
// Audruck entspricht nicht dem Suchpattern
}
 
Meinst Du so?

/[^e]\d{2}/

Aber eigentlich verstehen ich nicht so ganz was Du matchen willst.
 
Indem Du genau anders auf das gleiche Abfrageresultat reagierst ( oder ich verstehe Dich da falsch). Für regex-Prüfungen kann man ja ereg() verweden:

http://de.php.net/manual/en/function.ereg.php


Als Resultat der Funktion steht da:
Returns the length of the matched string if a match for pattern was found in string , or FALSE if no matches were found

also müßtest Du wohl abfragen a la

if (! ereg(...)) {
// Audruck entspricht nicht dem Suchpattern
}

ja. nein. ich wollte versuchen, die negierung in den regulären ausdruck zu packen, nicht mit "!" in PHP. mir gehts drum, reguläre ausdrücke besser zu verstehen/besser zu beherrschen.

außerdem wird mir so der string nur überprüft, und nicht verändert. (okay, das könnte ich mit ereg_replace tun...)
 
Zuletzt bearbeitet:
Dann so?

/[^e][^\d]{2}/

mir gehts drum, reguläre ausdrücke besser zu verstehen/besser zu beherrschen.
Dann weise ich mal kurz darauf hin dass Charachterklassen m.E. so nicht funktionieren. /[^e{1}\d{2}]/ Das heisst dann lediglich alles ausser e,{,} und keine Zahlen. Der Rest wäre doppelt enthalten.
 
hallo,

ich möchte einen variableninhalt per regex (PHP) überprüfen.
als beispiel-inhalt nehmen wir mal den string
"awdasdfe89woeir366joweif55re27jowee98ijrow".

es soll nun alles rausgefiltert werden, was sich als kleines "e", gefolgt von genau 2 Ziffern darstellt. das klappt auch soweit, mit
/[e]\d{2}/
erhalte ich 3 treffer ('e89', 'e27' und 'e98').

]

Ich würde es so machen:

Code:
<?php
$string = 'awdasdfe89woeir366joweif55re27jowee98ij row';
$pattern = '/e\d{2}/';
$replacement = '';
echo preg_replace($pattern, $replacement, $string);
?>
 
Ich würde es so machen:

Code:
<?php
$string = 'awdasdfe89woeir366joweif55re27jowee98ij row';
$pattern = '/e\d{2}/';
$replacement = '';
echo preg_replace($pattern, $replacement, $string);
?>

Dann würde aber z.B. e89 komplett gelöscht und 89w würde nicht mehr gefunden, was ja aber soll, wenn ich nicht auf dem Holzweg bin. :)
 
Ich würde es so machen:

Code:
<?php
$string = 'awdasdfe89woeir366joweif55re27jowee98ij row';
$pattern = '/e\d{2}/';
$replacement = '';
echo preg_replace($pattern, $replacement, $string);
?>

nein, genau das eben nicht.

vorher: awdasdfe89woeir366joweif55re27jowee98ij row
nachher: awdasdfwoeir366joweif55rjoweij row

es soll aber sein
vorher:awdasdfe89woeir366joweif55re27jowee98ij row
nacher: e89
 
Dann würde aber z.B. e89 komplett gelöscht und 89w würde nicht mehr gefunden, was ja aber soll, wenn ich nicht auf dem Holzweg bin. :)

Ups, war das verlangt? Das hab ich wohl überlesen. Hab grad gesehen, dass es dem TE ums Verständnis von regex ging. Da fällt meine Lösung wohl eh aus.

Da regex nie negativ sein kann, würde ich mit Gruppen arbeiten:

Schnellschuss (sed Syntax!): ^/(.*)e\d{2}(.*)/\1\2/

Also grob gesagt: Match alles bis zum ersten eXX, dann weiter. Da es aber beliebig viele eXX geben kann, müsste man das noch weiterdenken.
 
nein, genau das eben nicht.

vorher: awdasdfe89woeir366joweif55re27jowee98ij row
nachher: awdasdfwoeir366joweif55rjoweij row

es soll aber sein
vorher:awdasdfe89woeir366joweif55re27jowee98ij row
nacher: e89

Jetzt versteh ich die Frage nicht mehr. :confused:
 
ich auch nicht! :)

loginvergessen schrieb:
es soll aber sein
vorher:awdasdfe89woeir366joweif55re27jow ee98ij row
nacher: e89

Das wäre ein einfacher regex

So wie ich Regex verstehe gibt es eine Verneinung schlicht deswegen so nicht wie Du sie suchst, eben weil sich das ja in umgekehrter Interpretation des Matching-Results wiederfindet. Will sagen positives und negatives Matching sind die selbe Operation nur mit einer anderen Reaktion auf das Ergebnis. Daher auch mein obiger Vorschlag!
 
:hum: wenn mich drei leute nicht verstehen, hängts an denen oder an mir... mal sehen, ob ich mich anders ausdrücken kann... ;)

folgender code tut das, was ich wollte.
Code:
<?PHP
	$eingangsstring = 'awdasdfe89woeir366joweif55re27jowee98ij row';
	$muster = '/(e\d\d)/';
	$ausgabe = preg_match($muster, $eingangsstring, $treffer);
	echo $treffer[0];
?>
mit 'awdasdfe89woeir366joweif55re27jowee98ij row' gefüttert, bleibt 'e89' übrig. das erste vorkommen des musters 'e\d\d'.
ich dachte, das sei irgendwie kürzer formulierbar, halt direkt mit einem umgedrehten/negierten suchmuster. scheint aber nicht zu gehen.

vielleicht hätte ich auch im ersten beitrag schreiben sollen "es soll nun alles GELÖSCHT werden, was nicht dem muster 'e\d\d' entspricht".
ich dachte, /^[e\d\d]/ könnte vielleicht funktionieren. tut es aber nicht, wie gezeigt. auch /(^[e\d\d])/ oder /[^[e\d\d]]/ führen nicht zum ziel.

oder anders gesagt:
die umkehrung von '\d' ist '\D'
die umkehrung von '\w' ist '\W'
die umkehrung von 'e\d\d' ist ??????

trotzdem danke für eure mühen!
 
oder anders gesagt:
die umkehrung von '\d' ist '\D'
die umkehrung von '\w' ist '\W'
die umkehrung von 'e\d\d' ist ??????

trotzdem danke für eure mühen!

'e\d\d' ist keine Characterklasse, daher kann es dafür auch keine definierte Umkehr geben. Die logische Umkehr wäre meine o.g. PHP-Lösung.

Wie wegus schon sagte: Eine Verneinung gibt es nicht. \d = Alle Ziffern. \D = Alle Nichtziffern.
 
Einen String, der nicht "e89" ist, findest Du zum Beispiel mit

([^e]|(e[^e])|(e8[^9]))*(e?|(e8)?)

Das würde allerdings auch den Nullstring finden. Soll es das nicht, muß man noch ein bißchen arbeiten.

(Bin mir nicht sicher, ob das komplett PHP-Notation ist.)

EDIT: Mist, Fehler. :shame: Jetzt könnte es stimmen.
 
Zurück
Oben Unten