可选的空格正则表达式

72

我试图忽略某些字符之间的空格,但是遇到了问题。我已经在谷歌上搜索了几天,似乎找不到正确的解决方案。

这是我的代码:

// 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 =" "之间缺少空格。)

是否有办法忽略这些字符之间的空格?因为我不是正则表达式专家。

1个回答

162

如果可以允许空格,请添加 \s?

\s 表示空白符。

? 表示前面的字符可以出现一次也可以不出现。

如果允许多个空格且可选,则使用 \s*

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

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

允许属性名和等号之间有可选空格。

如果您还想在 = 后面添加一个可选的空格,也可以在其后加上 \s?

同样,无论您有哪些可选字符,如果最大出现次数为1,则可以在可选字符后使用? ,或者最大出现次数无限,则使用*,接着是可选字符。

您实际的问题是 [\s*] 导致出现了被括在[]中的字符的空格*。字符类允许任何成员出现一次(因此,请从其中删除*),如果在]后附加量词符(?+*等),则字符类中的任何字符都可以根据量词符出现。


谢谢!我把 [\s*] 改成 \s? ,现在它可以工作了! :) 谢谢! - jameslfc19
6
@jameslfc19 \s? 表示匹配 0 或 1 个空格字符。但是,如果有多于 1 个空格字符怎么办?你需要使用 \s* 来匹配 0 或更多。顺便说一句,你不应该使用正则表达式来解析 HTML,而应该使用其中的一个方法 - cryptic ツ
@naveed-s,我在具名捕获中遇到了尾随空格的问题,但我无法使其正常工作,你能否指导我缺少什么? RegExp链接 我正在尝试实现的是在匹配搜索项中包含单词"contact"。 - HenonoaH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接