とりあえず落ち着け

サブカル系webエンジニア見習いの備忘録

【PHP】正規表現について

HTMLデータをプレーンテキストに加工したいという時に使っていたら色々知ることがあったので覚書。

 

・preg_match関数のパターン変数について

$pattern = "/ ~~/"

のように/をデリミタに使っていたが、実は括弧とか記号でもいいらしい。

ただし、正規表現で用いられる記号などは酷く解りづらいのでオススメしない。

個人的には{~~}が1番しっくりきたので今後これを使おうと思う。

 

・サブパターンの有効活用

PHP正規表現において( )で囲われた部分はサブパターンとして機能する。

preg_match関数ではマッチした部分文字列を保存すると、サブパターンの部分も保存してくれる

例)<p>タグで囲われたテキストを抽出する

$text = "<p>ここを取り出したい</p>";

$pattern = "{<p>(.*)<\/p>}";

preg_match($pattern,$text,$match);

こうすると一致結果が$matchに入り、

$match[0] = "<p>ここを取り出したい</p>"

$match[1] = "ここを取り出したい"

となる。

一気にタグを除去した情報まで手に入れられるのでうまく使いたいところ。

 

・オブジェクト定数を用いたパターン

正規表現でURLを取得する機会が多かったのでオブジェクト定数化した際にちょっと引っかかったのでメモ

オブジェクト定数

const URL_PREG = "○○"

このような形でパターンを定数化して扱いやすくした。

定数化する際にデリミタを一緒に記述してはいけない。

なぜなら、デリミタを記述するとpreg_matchの書き方が

preg_match(URL_PREG,$text,$match);

となる。この時、第1引数が$で始まる変数でもなく、"で囲われた文字列でもないので関数側が解釈できないらしい。

なので、第1引数は "{".URL_PREG."}"と書いた方がいい…がコレも間違い。

オブジェクト定数を扱っているので正解は "{".self::URL_PREG."}"となる。