php 正規表現のサンプル

2011/04/20
phpで使う正規表現のサンプル。
※もっと良い記述があるかも。気づいたり・指摘していただく度に修正していきます。

基本

0回以上と1回以上、0or1回のみ

/d*a/
0回以上:「d」が0文字以上あり、その後に「a」がある。
/d+a/
1回以上:「d」が1文字以上あり、その後に「a」がある。
/d?a/
0or1回のみ:「d」が0文字もしくは1文字あり、その後に「a」がある。

最長一致

/d.*a/
「d」のあとに任意の文字が0文字以上あり、最後に出現する「a」まで。
/d.+a/
「d」のあとに任意の文字が1文字以上あり、最後に出現する「a」まで。

最短一致

/d.*?a/
「d」のあとに任意の文字が0文字以上あり、最初に出現する「a」まで。
/d.+?a/
「d」のあとに任意の文字が1文字以上あり、最初に出現する「a」まで。
/d(.*?)a/
「d」のあとに任意の文字が0文字以上あり、最初に出現する「a」まで。(.*)でマッチする箇所を「$1」とかで抜き出したい場合。

サンプル

複数の半角スペース

/ +/
「 (半角スペース)」が1文字以上ある。

複数の空白

/\s+/
全角・半角スペース・タブなどの組合せは関係無しで1文字以上。「半角スペースのあとにタブ」や「タブのあとに全角スペース、その後にタブ、半角スペース」とかも。

 など特殊文字(エンティティ)とか

/&(([a-zA-Z]{2,}[a-zA-Z0-9]*)|(#[0-9]{2,4})|(#x[a-fA-F0-9]{2,4}))?;/
特殊文字は「実体参照」と「コード参照」の2種類がある。
「実体参照」は「&」のあとに「アルファベットが2文字以上([a-zA-Z]{2,})」あり、その後に「アルファベットや数字が付く場合もあったり([a-zA-Z0-9]*)」して「;」で終わる。
「コード参照(10進数)」は「&#」のあとに数字が2~4桁([0-9]{2,4})あり「;」で終わる。「コード参照(16進数)」は「&#x」のあとに「a~f(大文字も同じ)」と数字が2~4桁([a-fA-F0-9]{2,4})あり「;」で終わる。

具体的な記述は「HTMLの特殊文字」や「HTML-特殊文字」を参考に。

半角数字しか存在しない

/^[0-9]+$/
最初から最後まで半角数字

最初に表示される「../」や「../../」とか

/^(..\/)+/
最初が「../」で、1回以上「../」を繰り返す
※「()」で文字列を一つのグループにする。

特定のタグに囲まれた内容(scriptタグの場合)

/<script.*?>(.*?)(<\/script>)/
「<script」で始まって「>」が出現。その後、適当な文字があったり無かったりして、最初に出現する「</script>」まで。

置換えのサンプル

特定のタグに囲まれた内容の中身に置換え

UTF8で大文字・小文字関係なく、<script>~</script>タグを中身だけに置き換える。
※「<script xxx>○○</script>」を「○○」に置き換える

preg_replace('/<script.*?>(.*?)<\/script>/ui', "$1", $str);
パターン文字列の「1番目の(.*?)」が「$1」になる。

特定の文字列に囲まれた箇所を特定の文字列に差換え

※「<script xxx>○○</script>」を「<script xxx></script>」に置き換え。

preg_replace('/(<script.*?>).*?(<\/script>)/ui', "$1$2", $str);
パターン文字列の「1番目の(<script.*?>)」が「$1」、「2番目の(<\/script>)」が「$2」。

特定の文字に他の文字を付け足す

「。」と「、」のあとに半角スペースを追加する。

preg_replace('/(。|、)/u', "$1 ", $str);
パターン文字列の「。」もしくは「、」が「$1」になる。

新着(ニュース関連以外)

2018-07-26
年賀状で「新春」とか書くけど・・・何故なんだろうと8月を目前にした今、疑問に思った。
2018-05-16
PHPで画像のヘッダ情報(?)の「Orientation」を元に画像回転させたい。
2018-03-05
Android Studioをインストール。エミュレータを軽くするトコまで終わらせたかったけど、挫折した。
2018-02-23
プッシュ通知について調べてた時にでてきたServiceWorker。そのServiceWorkerについてのメモ。
2017-12-13
jqueryで取得したDOM要素をオブジェクトじゃなくて、配列で受け取りたい