2013-01-12 111 views
20

我在嘗試忽略某些字符之間的空格時出現問題。我一直在搜索幾天,似乎無法找到解決方案。可選空白正則表達式

這裏是我的代碼:

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

基本上這些都是一些場景,我有:

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

(注意缺乏寬度之間的空間= 「」 和src = 「」)

而且

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

(注意width =「」和height =「」之間沒有空格)

有沒有辦法忽略這些字符之間的空格?因爲我不是正則表達式專家。

回答

68

如果可以允許空間,請添加\s?

\ S代表空格

表示前面的字符可能會出現一次或不發生。

如果允許多個空格並且是可選的,請使用\s*

*表示前面的字符可以出現零次或多次。

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

允許屬性名稱和=之間的可選空格。

如果您想在=之後還有一個可選空間,也可以在它後面添加一個\s?

同樣地,只要您有可選的字符,你可以使用?如果最大發生是或*如果最大發生是無限的,後面的可選角色。

您的實際問題是[\s*]導致的一個空白一個*作爲封閉在[]字符是一個字符類出現。一個字符類別允許其任何一個成員出現一次(所以從中刪除*),並且如果在]之後追加了一個量詞(?,+,*等),則根據量詞可以出現字符類別中的任何字符。

+0

謝謝!我將[\ s *]更改爲\ s?它現在可以工作! :) 謝謝! – jameslfc19

+0

@ jameslfc19'\ s?'表示0或1個空白字符。但是,如果有多個空白字符會怎樣?你想要'\ s *',所以它會匹配0或** more **。順便說一句,你不想使用正則表達式來解析HTML。您想使用[這些](http://stackoverflow.com/q/3577641/1592648)方法之一。 –