2010-07-06 14 views
6

Estaba leyendo other question que tiene algunas expresiones regulares muy buenas para el trabajo, pero hasta donde puedo ver, ninguna de ellas funciona con comandos BASH ya que los comandos BASH no son compatibles con tales complejos rexeg.Verifique si hay un enlace válido (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 

Pero esto no funciona como -q grep no funciona ...

Editar, bien me di cuenta de que tenía un grep "en expresiones regulares extendida" opción (-E) que parece hacer que funcione. Pero si alguien tiene una manera mejor/más rápida, todavía me encantaría hablar al respecto.

+0

Es posible que desee examinar su motivación para hacer esta pregunta. Los programadores intentan hacer una evaluación estática de URL/URI y direcciones de correo electrónico que puede mostrar para que sean sintácticamente válidas, pero no le dicen nada sobre su accesibilidad. Por ejemplo, 'http: // www.example.com/bogus # fragment' siempre será sintácticamente válido y (presumiblemente) siempre devolverá un error 404. – msw

+0

Esta función no necesita saber si los enlaces funcionan o no, solo que es un enlace. – Mint

+0

¿De qué sirve una URL que nunca localiza un recurso? ¿Por qué molestarse en chequear? – msw

Respuesta

14

las siguientes obras en Bash> = versión 3.2 sin necesidad de utilizar grep:

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 

Su expresión regular no parece incluir caracteres alfabéticos en minúsculas [a-z] así que les añaden aquí.

+2

Error con 'http: // печки-лавочки.рф /' que es una URL válida. Se puede encontrar una expresión regular más completa en http://stackoverflow.com/questions/161738 –

+0

agradable, que funciona sin problemas con egrep también (especialmente que necesitaba algunas URLs que terminan en .mp3), Nicolas Raoul, dos problemas: 1. Estaba buscando solución bash ¡NO PHP! (no siempre funciona con bash, y no es fácil de convertir) también, SUX internacional, por lo general solo se aplica en ese país y que quiere ser visitado por todos, no usará chrs fuera de ascii estándar (estoy viviendo en ese país y trata de evitarlo a toda costa) ... Ni siquiera estoy hablando de que no tienes una respuesta marcada como solución ... – THESorcerer

+0

Esto fue útil. Pero creo que desea anclar la expresión regular para evitar que una cadena como '' basura http: // google.com'' se pase como válida. Acabo de agregar^y $ al principio y al final de la expresión regular, como sigue: 'regex = '^ (https? | Ftp | file): // [-A-Za-z0-9 \ + & @ # /%? = ~ _ |!:,.;] * [- A-Za-z0-9 \ + & @ # /% = ~ _ |] $ '' –

1

Probablemente porque la expresión regular está escrita en sintaxis PCRE. Vea si tiene (o puede instalar) el programa pcregrep en su sistema; tiene la misma sintaxis que grep, pero acepta expresiones regulares compatibles con Perl, y usted debería ser capaz de hacerlo funcionar.

Otra opción es probar la opción -P en grep, pero la página man dice que es "altamente experimental" por lo que puede funcionar o no.

Diré que debe pensar detenidamente si es realmente apropiado usar esta o cualquier expresión regular para validar una URL. Si desea obtener una validación correcta, probablemente sea mejor que busque o escriba un pequeño script en, por ejemplo, Perl, para usar las funciones de validación de URL del idioma.

EDIT: En respuesta a su edición en la pregunta, no noté que esa expresión regular también es válida en la sintaxis "extendida". No creo que puedas ser mejor/más rápido que eso.

+0

Esto es solo el backend, se realizará más validación en php antes de que se muestre nada. – Mint

Cuestiones relacionadas