Zerlegung einer URI mit Reg.Ex. [PERL]


deostift

Erfahrenes Mitglied
Hallo zusammen,

ich stehe vor der tollen Aufgabe folgende URI mit einer Regular Expression zerlegen zu können, so dass ich immer nur 'state' erhalte:

http://irgendwas/?s=state&var1=1&var2=2
http://irgendwas/?s=state/nochwas/
http://irgendwas/?s=state

Kann ich diese mit einem Ausdruck zerlegen um eben nur 'state' zu erhalten oder wie würdet Ihr das angehen. Folgenden RegEx habe ich mal zusammengebaut:

Code:
my $testString = 'http://irgendwas/?s=state&var1=1&var2=2';
if( $testString =~ /\/?s=(.*?)[\/|&]./ ) {
	print $1; # >> state (funktioniert)
}
$testString = 'http://irgendwas/?s=state/nochwas/';
if( $testString =~ /\/?s=(.*?)[\/|&]./ ) {
	print $1; # >> state (funktioniert)
}
$testString = 'http://irgendwas/?s=state';
if( $testString =~ /\/?s=(.*?)[\/|&]./ ) {
	print $1; # >> nix (Vergleich nicht gueltig)
}
Warum das mit dem Punkt zumindest bei den beiden längeren URIs hinhaut .. keine Ahnung. Ich hätte eher erwartet dass mit /\/?s=(.*?)[\/|&]*/ es funktionieren sollte - geht aber bei keinem Fall.

Vielen Dank Für die Rückmeldungen.
 

Gumbo

Erfahrenes Mitglied
Probier mal folgenden regulären Ausdruck (siehe RFC 2396):
Code:
^(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?
Damit erhältst direkt die fünf Komponenten. Den Query-Teil könntest du dann noch weiter zerlegen.
 

deostift

Erfahrenes Mitglied
Danke Dir für Deine Antwort Gumbo, mich würde aber eher interessieren was ich an meinem Ausdruck falsch habe bzw. ob das wirklich nur mit so nem RegEx-Monster (wie von Dir) funktionieren kann.
 

Gumbo

Erfahrenes Mitglied
Das Fragezeichen ist ein Metazeichen und müsste in dem Fall ebenfalls maskiert werden. Zudem drücken die regulären Ausdrücke durch das „[\/|&].“ am Ende aus, dass mindestens ein Schrägstrich, „|“- oder ein „&“-Zeichen sowie ein weiteres beliebiges Zeichen folgen.
 

deostift

Erfahrenes Mitglied
Stimmt - so kanns nicht gehen :(

Ich habe nun einen Workaround eingebaut - ich weiß immer noch nicht wie ich in einem RegEx hinter dem s-Parameter das & oder / bzw. gar nichts zulassen kann und eben nur den Wert des s-Parameters bekomme.

Wenn jemand noch eine Lösung mit einem RegEx Ausdruck hat, mit dem solche "Workarounds" nicht notwendig sind, wäre ich sehr dankbar :)

Habe zwei Workarounds:

1. Ich füge dem URI String ein abschließendes Zeichen zu, das nicht verwendet würde ( z.B. |) und filtere dann eben mit
Code:
/\/\?s=(.*?)[\/&|]/
2. Oder ich mache mehrere Schritte um zum Ergebnis zu kommen:

Code:
sub split_HTTP_REFERER($) {
	my $uri = shift @_;
	
	# Suche nach URI mit mehreren Parametern bzw. /
	if( $uri =~ /\/\?s=(.*?)[\/&]/ ){
			# Wurde gefunden - Pruefung auf Parameter (&)
			if( $uri =~ /\/\?s=(.*?)&/ ) {
				print "\nTREFFER (&): $1\n\n";
			}
			# Pruefung auf /
			elsif ( $uri =~ /\/\?s=(.*?)\// ) {
				print "\nTREFFER (/): $1\n\n";
			}
			# Eventuelle Fehler abfangen
			else {
				print "\nGing leider nicht :( \n\n"	;
			} 
	}
	# Wurde denn ueberhaut der Parameter 's' gesetzt?
	elsif ( $uri =~ /\/\?s=(.*)/ ) {
		print "\nTREFFER: $1\n\n";
	}
	# Keine gueltige URI mit s Parameter
	else {
		print "\nGing leider nicht :( \n\n"	;
	}
}
 

Gumbo

Erfahrenes Mitglied
Wieso ersetzt du nicht den generischen Ausdruck „(.*?)“ durch etwas Spezifischeres? Beispielsweise durch einen Ausdruck für die Menge der erlaubten Zeichen?
 

Neue Beiträge