こんにちは。はじめての投稿です。
今回はPHPの正規表現について少し書こうかな、と思います。
さっそく書いてみます
最近「HTMLファイル内の参照画像パスを一覧化しましょう」なんてことをしてます。
ここでパスとは、例えば「<img src=”./imgs/img_1.jpg”>」の「””」内の記述を指すとします。
フロントエンド側のタグの記述はさまざま想定されますね。
1 2 3 4 |
<img src="./imgs/img_1.jpg"> <img src = "./imgs/img_1.jpg"> <img src = "./imgs/img_1.jpg" > <img alt="画像1" src="./imgs/img_1.jpg"> |
これらから「”./imgs/img_1.jpg”」部分だけを綺麗に取り出す必要があるとします。
以下、PHPの記述。
1 2 3 4 5 6 7 8 |
//対象ファイルはこちら $file = "./test.html"; //ファイルソースを文字列として所得 $file_content = file_get_contents($file); //その中に画像パスがあるか検索します preg_match_all('/<img.*src\s*=\s*[\"|\'](.*?)[\"|\'].*>/i', file_get_contents($file), $img_path_list); //表示します print_r($img_path_list[1]); |
上記のうち正規表現はこの部分です。
1 |
'/<img.*src\s*=\s*[\"|\'](.*?)[\"|\'].*>/i' |
具体的に見ていきましょう。
今回の正規表現について
正規表現 | 概要 |
. | 改行文字以外の任意の一文字を示します |
* | 0回以上の繰り返しを示します |
\s | スペースを示します |
\” | ダブルクォーテーションを示します |
\’ | シングルクォーテーションを示します |
| | 論理和(OR)を示します |
? | 0回または1回の出現を示します |
※詳しくはこの辺をご覧ください。
まずimgタグとsrc属性の間には、スペースや他の属性(alt属性やclass属性)等、何が入ってもおかしくはないため、「.*」と記述してます。これは、「任意の一文字の0回以上の繰り返し」であり、ワイルドカードのような扱いが出来ます。
そして、「=」の前後にはスペースを許します。ここでは「\s*」を記述しています。「スペースの0回以上の繰り返し」ということです。
さらに画像パスを囲う記号はシングル/ダブルクォーテーションどちらもあり得ます。論理和記号である「|」を使って「[\”|\’]」と記述します。
重要な画像パスの記述されている部分ですが、「(.*?)」と記述します。ここで「?」を付けることで「任意の位置文字の0回以上の繰り返しであり、0回または1回の出現」ということになります。
HTMLに下記のような記述があったとします。
1 |
<img src="./imgs/img_1.jpg" width="5" height="5" alt="画像1"> |
このとき上記「(.*?)」を「(.*)」と記述していると、所得するパスは
1 |
$img_path_list[1] = "./imgs/img_1.jpg" width="5" height="5" alt="画像1" |
となってしまうんですね(詳しくはこちらとか)。ですので「0回または1回の出現」を示す「?」を後ろに付けましょう。これによって、「”./imgs/img_1.jpg”」部分だけを取得できます。
1 |
$img_path_list[1] = "./imgs/img_1.jpg" |
次回は「パターン修飾子」についてご説明します(゜-゜)