2016-04-07 15 views
6

Asuming ho qualcosa di simileCome posso ottenere un valore da un URL?

var url = 'http://stackoverflow.com/questions/24a34b83c72/js-regex-get-values-between-two-characters' 

Come ho potuto ottenere l'ID 24a34b83c72 utilizzando JavaScript puro? So che è sempre dopo la parte questions/ e che, indipendentemente dal fatto che contenga un numero o un simbolo, deve terminare prima del prossimo /. Ho provato cose del genere;

url.substring(url.lastIndexOf('questions/'))

Ma che ha provocato l'intero thread dopo. Ho provato esprimono tutti regolari, ma il più vicino ho avuto modo di dire:

var regex = /"details\/"[a-zA-Z0-9]+"\/"/

Qualcuno mi può aiutare?

+3

'/ questions \/([^ /] +) /' https://regex101.com/r/kO9pK4/1 – zerkms

+1

Non ci sono "dettagli" nell'URL di esempio che hai fornito. – jmoerdyk

+0

'var result = url.match (/ questions \/(. +?) \ //)' eseguirà una corrispondenza regolare che ha l'output desiderato come gruppo abbinato. Dopo aver verificato che la corrispondenza abbia avuto successo, è possibile estrarre l'output con 'result [1]'. –

risposta

2

Si potrebbe gruppo tutto dopo questions/ e prima della prossima /, in questo modo:

url.match(/questions\/([^/]+)/)[1] 

È possibile visualizzare l'output di url.match(..) è questo:

["questions/24a34b83c72", "24a34b83c72"] 

Il secondo elemento è lì a causa della la parentesi intorno a [^/]+, quindi l'accesso con url.match(..)[1].

+0

Questo ha fatto il trucco, grazie. –

1

se insistete nel regexp:

questions\/([0-9A-Za-z]+?)\/ 

https://regex101.com/r/dE1oC7/1

Questo dovrebbe corrispondere alla stringa fornita come esempio.

2

Le espressioni regolari sono utili per motivi più complessi o corrispondenze ripetute. I tuoi requisiti sono semplici e singolari.

dividere la stringa da '/', trovare l'indice del 'questions', il risultato è nel successivo indice:

var parts = url.split('/'); 
var result = parts[parts.indexOf('questions') + 1]; 
0

Questo ha funzionato per me, con il vostro esempio sulla console di Firefox:

>> var url = 'http://stackoverflow.com/questions/24a34b83c72/js-regex- get-values-between-two-characters' 
    >> var regex = /questions\/([a-zA-Z0-9]+)\// 
    >> regex.exec(url) 

    Array [ "questions/24a34b83c72/", "24a34b83c72" ] 

Il secondo elemento dell'array dovrebbe essere quello che stai cercando.

0

[Un'altra opzione]

mi piacerebbe interpretare la stringa URL prima e dopo interpretare ciò che l'interpretazione ritorna per me (come un Abtract syntax tree). Il seguente blocco di comandi mangerà la stringa url mentre il ciclo sottostante è in esecuzione (o nell'interpretazione di), costruendo una matrice rappresentativa in passaggi!

var curChar, 
    directoryPassed,//not yet 
    expectGetValue, 
    getContent="", 
    getStarted,//? not started ($_GET) 
    inPort,//not reading port 
    portRead,//port not read yet 
    state=0,//first state 
    text="", 
    urlTree=[]; 
for(;;){ 
    curChar=url.charAt(0);//first char 
    if(state===0){ 
     //expects http... ws... file or https, for example. 
     if(curChar===""){ 
      throw new Error("http:// expected.") 
     }else if(curChar===":"){ 
      if(directoryPassed){ 
       throw new Error("Unexpected token.") 
      } 
      urlTree.push({type:"URLProtocol",value:text}); 
      text=""; 
      state=1 
     }else{ 
      text+=curChar 
     } 
    }else if(state===1){ 
     //expects //... 
     if(url.substring(0,2)==="//"){ 
      state=2; 
      url=url.substring(1) 
     }else if(curChar===""){ 
      throw new Error("// expected.") 
     } 
    }else{ 
     //expects anything correct: site.com/dir, localhost:8080, ?get=0, etc. 
     if(getStarted){ 
      if(curChar==="="){ 
       if(text.length===0){ 
        throw new Error("Unexpected token.") 
       }else{ 
        expectGetValue=true; 
        getContent="" 
       } 
      }else if(curChar==="&"){ 
       if(expectGetValue||text.length!==0) 
        urlTree.push({type:"Variable",name:text,value: (getContent||true) }); 
       expectGetValue=false; 
       text="" 
      }else if(curChar===""){ 
       if(expectGetValue||text.length!==0) 
        urlTree.push({type:"Variable",name:text,value: (getContent||true) }); 
       break 
      }else{ 
       if(expectGetValue){ 
        getContent+=curChar 
       }else{ 
        text+=curChar 
       } 
      } 
     }else if(curChar==="."){ 
      if(text.length===0){ 
       throw new Error("Unexpected token.") 
      }else{ 
       if(inPort){ 
        throw new Error("Unexpected token in port.") 
       }else{ 
        urlTree.push({type:"Name",value:text}); 
        text="" 
       } 
      } 
     }else if(curChar===""){ 
      if(text.length!==0){ 
       if(inPort){ 
        urlTree.push({type:"Port",value:text}) 
       }else{ 
        urlTree.push({type:"Name",value:text}) 
       } 
       text="" 
      }else if(inPort){ 
       throw new Error("Port not specified.") 
      } 
      break 
     }else if(curChar==="?"){ 
      //$_GET starts here. 
      if(text.length!==0){ 
       if(inPort){ 
        urlTree.push({type:"Port",value:text}) 
       }else{ 
        urlTree.push({type:"Name",value:text}) 
       } 
       text="" 
      } 
      getStarted=true; 
      urlTree.push({type:"Get"}) 
     }else if(curChar==="/"){ 
      if(text.length===0){ 
       throw new Error("Unexpected token.") 
      }else{ 
       directoryPassed=true; 
       if(inPort){ 
        inPort=false; 
        urlTree.push({type:"Port",value:text}) 
       }else{ 
        urlTree.push({type:"Name",value:text}) 
       } 
       text=""; 
       urlTree.push({type:"NextDirectory"}) 
       //New directory! 
      } 
     }else if(curChar===":"){ 
if(portRead||text.length===0){ 
       throw new Error("Unexpected token.") 
      }else{ 
       urlTree.push({type:"Text",value:text}); 
       text=""; 
       inPort= 
       portRead=true; 
       //Now the port will never be defined again. 
      } 
     }else if(inPort){ 
      if(/[0-9]/.test(curChar)){ 
       text+=curChar 
      }else{ 
       throw new Error("Invalid port token.") 
      } 
     }else{ 
      text+=curChar 
     } 
    } 
    url=url.substring(1) 
} 

Una volta che è correva, si ottiene la matrice urlTree costruito con base nella stringa url.Additionaly, l'URL attualmente restituisce il seguente albero in un array:

Parsed

nel codice. Ogni elemento dell'array tree è un oggetto. Ogni oggetto ha la proprietà type. type dice cosa rappresenta l'elemento.


In questo analisi, ci sono questi tipi (in stringa):

"URLProtocol" -> E 'forse http, https o qualsiasi altra cosa. Ha la proprietà: value (stringa di protocollo, come: "http", "ws", ecc.)

"Name" -> È il nome di qualcosa. Esempio: nome.nome ... nome.com ...? Nome = 0; Ha la proprietà: value (stringa del nome)

"NextDirectory" -> Rappresenta "/" - "Una nuova directory aperto"

"Get" ->? iniziato. "Ora le variabili URL possono essere dichiarate"

"Variable" -> rappresenta? variabile. Ha le proprietà: name e value;

Base. È tutto. Quindi è possibile interpretare la matrice con un ciclo numerico con le proprie istruzioni.