2013-01-12 33 views
20

Sto riscontrando un problema nel tentativo di ignorare gli spazi bianchi tra determinati caratteri. Sono stato su Google per un paio di giorni e non riesco a trovare la soluzione.Spazio bianco opzionale Regex

Ecco il mio codice:

// Get Image data 
preg_match('#<a href="(.*?)" title="(.*?)"><img alt="(.*?)" src="(.*?)"[\s*]width="150"[\s*]height="(.*?)"></a>#', $data, $imagematch); 
$image = $imagematch[4]; 

Fondamentalmente questi sono alcuni degli scenari che ho:

<a href="/wiki/File:Sky1.png" title="File:Sky1.png"><img alt="Sky1.png" src="http://media-mcw.cursecdn.com/thumb/5/56/Sky1.png/150px-Sky1.png"width="150" height="84"></a> 

(Si noti la mancanza di uno spazio tra width = "" e src = "")

E

<a href="/wiki/File:TallGrass.gif" title="File:TallGrass.gif"><img alt="TallGrass.gif" src="http://media-mcw.cursecdn.com/3/34/TallGrass.gif" width="150"height="150"></a> 

(Notare la mancanza di uno spazio tra larghezza = "" e altezza = "".)

C'è comunque da ignorare lo spazio bianco tra questi caratteri? Poiché non sono un esperto di Regex.

risposta

68

Aggiungere uno \s? se uno spazio può essere consentito.

\ s stand per lo spazio bianco

? dice che il carattere precedente può verificarsi una volta o non si verifica.

Se sono consentiti più spazi ed è opzionale, utilizzare \s*.

* dice che il carattere precedente può verificarsi zero o più volte.

'#<a href\s?="(.*?)" title\s?="(.*?)"><img alt\s?="(.*?)" src\s?="(.*?)"[\s*]width\s?="150"[\s*]height\s?="(.*?)"></a>#' 

consente uno spazio opzionale tra nome attributo e =.

Se si desidera uno spazio opzionale dopo lo =, aggiungere anche \s? dopo di esso.

Allo stesso modo, ovunque ci sia caratteri opzionali, è possibile utilizzare ? se l'occorrenza massima è o * se l'occorrenza massima è illimitata, seguendo il carattere facoltativo.

E il problema reale era [\s*] che causa verificarsi di uno spazio bianco o un * come personaggi racchiusi in [ e ] è una classe di caratteri. Una classe di caratteri consente l'occorrenza di uno qualsiasi dei suoi membri una volta (quindi rimuovere , +, * ecc.) Dopo il ] qualsiasi carattere nella classe di caratteri può verificarsi in base al quantificatore .

+0

Grazie! Ho cambiato [\ s *] in \ s? e funziona ora! :) Grazie! – jameslfc19

+0

@ jameslfc19 '\ s?' Significa 0 o 1 carattere di spazi bianchi. Tuttavia, cosa succede se ci sono più di 1 caratteri bianchi? Vuoi '\ s *' in modo che corrisponda a 0 o ** più **. A proposito di non voler usare regex per analizzare HTML. Si desidera utilizzare uno dei [questi] (http://stackoverflow.com/q/3577641/1592648) metodi. –