Come possono più barre di trascinamento possono essere rimossi da un URL in Ruby
-
03-10-2019 - |
Domanda
Quello che sto cercando di fare qui è diciamo abbiamo due URL di esempio:
url1 = "http://emy.dod.com/kaskaa/dkaiad/amaa//////////"
url2 = "http://www.example.com/"
Come posso estrarre gli URL righe verso il basso?
url1 = "http://emy.dod.com/kaskaa/dkaiad/amaa"
url2 = "http://http://www.example.com"
URI.parse
in Ruby igienizza certo tipo di URL non valido, ma non è efficace in questo caso.
Se usiamo regex /^(.*)\/$/
quindi rimuove un singolo /
barra da url1
ed è inefficace per url2
.
C'è qualcuno a conoscenza di come gestire questo tipo di URL parsing?
Il punto qui è che non voglio che il mio sistema per avere http://www.example.com/
e http://www.example.com
essere trattati come due URL diversi. E lo stesso vale per http://emy.dod.com/kaskaa/dkaiad/amaa////
e http://emy.dod.com/kaskaa/dkaiad/amaa/
.
Soluzione
Se avete solo bisogno di rimuovere tutte le barre a partire dalla fine della stringa URL allora si può provare la seguente espressione regolare:
"http://emy.dod.com/kaskaa/dkaiad/amaa//////////".sub(/(\/)+$/,'')
"http://www.example.com/".sub(/(\/)+$/,'')
/(\/)+$/
- questo regex trova uno o più barre alla fine della stringa. Allora sostituiamo questa partita con la stringa vuota.
Spero che questo aiuti.
Altri suggerimenti
Anche se questa discussione è un po 'vecchio e la risposta in alto è abbastanza buona, ma vi suggerisco un altro modo per fare questo:
/^(.*?)\/$/
Si potrebbe vederlo in azione qui: https://regex101.com/r/vC6yX1/2
La magia qui è *?
, che fa un incontro pigro. Così l'intera espressione potrebbe essere tradotto come:
Partita come alcuni personaggi come può e catturarlo, mentre incontro il maggior numero di barre come può alla fine.
Il che significa, in un inglese più semplice, rimuove tutte le barre di trascinamento.
def without_trailing_slash path
path[ %r(.*[^/]) ]
end
path = "http://emy.dod.com/kaskaa/dkaiad/amaa//////////"
puts without_trailing_slash path # "http://emy.dod.com/kaskaa/dkaiad/amaa"