57

特定の文字間の空白を無視しようとすると問題が発生します。私は数日間グーグルで探し回っていますが、正しい解決策を見つけることができないようです.

これが私のコードです:

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

これらの文字間の空白を無視する方法はありますか? 私は正規表現の専門家ではないので。

4

1 に答える 1

138

\s?スペースが許される場合は aを追加します。

\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*]た。文字クラスでは、そのメンバーのいずれかを 1 回出現させることができます (したがって、そこから削除します)。文字クラス内の任意の文字の後に量指定子 ( 、など)を追加すると、量指定子に従って発生する可能性があります。[]*?+*]

于 2013-01-12T11:49:43.607 に答える