2013-01-12 12 views
20

Mam problem z ignorowaniem spacji między określonymi znakami. Przez kilka dni googlowałem i nie mogę znaleźć rozwiązania.Opcjonalne białe znaki Regex

Oto mój kod:

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

Zasadniczo są to jedne z tych scenariuszy nie mam:

<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> 

(Zwróć uwagę na brak przestrzeni pomiędzy width = "" i src = "")

I

<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> 

(Zwróć uwagę na brak spacji między width = "" a height = "".)

Czy mimo to należy zignorować białe spacje pomiędzy tymi znakami? Ponieważ nie jestem ekspertem Regex.

Odpowiedz

68

Dodaj \s?, jeśli spacja może być dozwolona.

\ s oznacza białej przestrzeni

? mówi, że poprzedni znak może wystąpić raz lub nie.

Jeśli więcej niż jedna spacja jest dozwolona i jest opcjonalna, użyj \s*.

* mówi, że poprzedni znak może wystąpić zero lub więcej razy.

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

pozwala na opcjonalne spacje między nazwą atrybutu a =.

Jeśli chcesz opcjonalnego spacji po = również dodać po tym również \s?.

Podobnie, gdziekolwiek masz opcjonalnych znaków, można użyć ? jeśli maksymalna występowanie jest lub * jeśli maksymalna występowanie jest nieograniczona, po opcjonalnym charakterem.

A rzeczywisty problem był [\s*] co powoduje występowanie spacja lub a * jako znaków ujęty w [ i ] to klasa postaci. Klasa znaków pozwala na wystąpienie jednego z jej członków tylko raz (więc usuń z niej *), a jeśli dodasz kwantyfikator (?, +, * itp.) Po ], dowolny znak (y) w klasie znaków może wystąpić zgodnie z kwantyfikatorem .

+0

Dzięki! Zmieniłem [\ s *] na \ s? i teraz działa! :) Dziękuję Ci! – jameslfc19

+0

@ jameslfc19 '\ s?' Oznacza 0 lub 1 znak odstępu. Co jednak, jeśli istnieje więcej niż 1 znak odstępu? Chcesz '\ s *', aby pasowało 0 lub ** więcej **. Przy okazji nie używaj regex do parsowania HTML. Chcesz użyć jednej z tych metod (http://stackoverflow.com/q/3577641/1592648). –

Powiązane problemy