特定の文字の間の空白を無視しようとして問題があります。私は数日間グーグルで遊んでいて、適切な解決策を見つけることができないようです。
私のコードは次のとおりです。
// 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 = ""の間にスペースがないことに注意してください。)
とにかくそれらの文字の間の空白を無視することはありますか?私は正規表現の専門家ではありません。
スペースを許可できる場合は、\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回出現させることができ(そのため*
を削除し)、その後に量指定子(?
、+
、*
など)を追加した場合]
文字クラス内の任意の文字は、数量詞に応じて使用できます。