我在尝试忽略某些字符之间的空格时遇到问题。我一直在谷歌搜索几天,似乎无法找到正确的解决方案。
这是我的代码:
// 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>
(注意width =“”和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 =“”之间缺少空格。)
无论如何都要忽略这些角色之间的空格?因为我不是正则表达式专家。
答案 0 :(得分:82)
如果可以允许空格,请添加\s?
。
\ s 代表空格
?表示前面的字符可能会发生一次或不发生。
如果允许多个空格并且是可选的,请使用\s*
。
* 表示前面的字符可以出现零次或多次。
'#<a href\s?="(.*?)" title\s?="(.*?)"><img alt\s?="(.*?)" src\s?="(.*?)"[\s*]width\s?="150"[\s*]height\s?="(.*?)"></a>#'
允许属性名称与=。
之间的可选空格如果您想在=
之后添加可选空格,请在其后添加\s?
。
同样,只要您有可选字符,如果最大出现次数为 1 ,则可以使用?
;如果最大出现次数不受限制,则可以使用*
,可选字符后面。
您的实际问题是[\s*]
,导致空格或 a * 出现在[
和{{1}中的字符中是一个字符类。一个字符类允许其成员出现一次(因此从中移除]
)并且如果您追加量词(*
,?
,+
等) *
字符类中的任何字符都可以根据量词出现。