web-dev-qa-db-ja.com

オプションのホワイトスペース正規表現

特定の文字の間の空白を無視しようとして問題があります。私は数日間グーグルで遊んでいて、適切な解決策を見つけることができないようです。

私のコードは次のとおりです。

// 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 = ""の間にスペースがないことに注意してください。)

とにかくそれらの文字の間の空白を無視することはありますか?私は正規表現の専門家ではありません。

31
jameslfc19

スペースを許可できる場合は、\s?を追加します。

\ sは空白を表します

は、前の文字が1回出現する場合と出現しない場合があります。

複数のスペースが許可され、オプションである場合は、\s*を使用します。

*は、先行する文字が0回以上出現する可能性があることを示します。

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

属性名と=の間にオプションのスペースを許可します。

=の後にオプションのスペースが必要な場合は、\s?も追加します。

同様に、オプションの文字がある場合は、最大出現回数が1の場合は?を、最大出現回数の場合は*を使用できますオプションの文字に続いて、無制限です。

そして実際の問題は[\s*]で、これによりaの空白またはa *[]で囲まれた文字は文字クラスです。文字クラスでは、そのメンバーのいずれかを1回出現させることができ(そのため*を削除し)、その後に量指定子(?+*など)を追加した場合]文字クラス内の任意の文字は、数量詞に応じて使用できます。

84
Naveed S