2010-07-06 18 views
6

Ich habe diese other question lesen, die einige wirklich gute Regex für den Job hat, aber soweit ich sehen kann nicht mit BASH-Befehle arbeiten, wie BASH-Befehle solche komplexe Rexegs nicht unterstützen.Suchen Sie nach gültigen Link (URL)

if echo "http://www.google.com/test/link.php" | grep -q '(https?|ftp|file)://[-A-Z0-9\+&@#/%?=~_|!:,.;]*[-A-Z0-9\+&@#/%=~_|]'; then 
    echo "Link valid" 
else 
    echo "Link not valid" 
fi 

Aber das funktioniert nicht wie grep -q nicht funktioniert ...

bearbeiten, ok Ich habe erkannt, dass grep eine "erweiterte reguläre Ausdrücke" hatte (-E) Option das scheint zu funktionieren. Aber wenn jemand einen besseren/schnelleren Weg hat, würde ich immer noch gerne darüber reden.

+0

Vielleicht möchten Sie Ihre Motivation für das Stellen dieser Frage untersuchen. Programmierer versuchen, statische Auswertungen von URL/URIs und E-Mail-Adressen durchzuführen, die sich als syntaktisch gültig erweisen, aber nichts über ihre Zugänglichkeit sagen. Zum Beispiel wird "http: // www.example.com/false # fragment" immer syntaktisch gültig sein und (vermutlich) immer einen 404-Fehler zurückgeben. – msw

+0

Diese Funktion muss nicht wissen, ob die Links funktionieren oder nicht, nur dass es sich um einen Link handelt. – Mint

+0

Was nutzt eine URL, die nie eine Ressource findet? Warum noch einmal nachschauen? – msw

Antwort

14

Folgende Werke in Bash> = Version 3.2 ohne grep mit:

regex='(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]' 
string='http://www.google.com/test/link.php' 
if [[ $string =~ $regex ]] 
then 
    echo "Link valid" 
else 
    echo "Link not valid" 
fi 

Ihre Regex scheint nicht Klein Alpha-Zeichen enthalten [a-z] so habe ich sie hier.

+2

Fehler mit 'http: // печки-лавочки.рф /' was eine gültige URL ist. Eine umfassendere Regex finden Sie unter http://StackOverflow.com/Questions/161738 –

+0

nice, funktioniert einwandfrei mit egrep auch (vor allem, dass ich einige URL-Endung in MP3 benötigt), Nicolas Raoul, zwei Probleme: 1. Ich war Suche nach bash Lösung NICHT PHP! (nicht immer mit Bash arbeiten, und nicht einfach zu konvertieren) auch, internationale SUX, es gilt in der Regel nur in diesem Land und wer will von allen besucht werden, wird nicht chrs außerhalb standard ascii (ich lebe in solchen Ländern und versuche das um jeden Preis zu vermeiden) ... ich spreche nicht mal von dir habe keine Antwort als Lösung markiert ... – THESorcerer

+0

Das war hilfreich. Aber ich denke, dass Sie die Regex verankern möchten, um zu vermeiden, dass eine Zeichenfolge wie "Garbage http: // google.com" als gültig übergeben wird. Ich habe einfach^und $ am Anfang bzw. am Ende der Regex hinzugefügt: 'regex = '^ (https? | Ftp | file): // [-A-Za-z0-9 \ + & @ # /%? = ~ _ |!:,.;] * [- A-Za-z0-9 \ + & @ # /% = ~ _ |] $ '' –

1

Wahrscheinlich, weil der reguläre Ausdruck in PCRE-Syntax geschrieben wird. Sehen Sie, ob Sie das Programm pcregrep auf Ihrem System haben (oder installieren können) - es hat die gleiche Syntax wie grep, akzeptiert aber Perl-kompatible Regexes - und Sie sollten in der Lage sein, das zu machen.

Eine andere Möglichkeit ist es, die -P Option zu grep zu versuchen, aber die Manpage sagt, dass das "sehr experimentell" ist, so dass es funktionieren kann oder nicht.

Ich werde sagen, dass Sie sorgfältig darüber nachdenken sollten, ob es wirklich angemessen ist, diese oder irgendeine Regex zu verwenden, um eine URL zu validieren. Wenn Sie eine korrekte Validierung wünschen, sind Sie wahrscheinlich besser dran, ein kleines Skript in Perl zu finden oder zu schreiben, um die URL-Validierungsfunktionen der Sprache zu verwenden.

BEARBEITEN: Als Reaktion auf Ihre Bearbeitung in der Frage habe ich nicht bemerkt, dass diese Regex auch in "erweiterte" Syntax gültig ist. Ich glaube nicht, dass du besser/schneller werden kannst.

+0

Dies ist nur das Backend, mehr Validierung wird in PHP durchgeführt, bevor alles angezeigt wird. – Mint

Verwandte Themen