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