Contents
- UNIX
- Windows
- サーバ
- プログラミング言語
- データベース
- プロトコル
- サービス
- オープンソース
- 規格・技術
- アプリケーション
- PC
- DEVICE
- その他(未分類)
お問合せ:
メールフォーム
$str = '<font color="red"><font size="3">フォントカラー赤:サイズ3</font></font>';
上記文字列から「 フォントカラー赤:サイズ3 」を抽出する場合を考える
<?php $str = '<font color="red"><font size="3">フォントカラー赤:サイズ3</font></font>'; preg_match('#<font\s+.*?>(.+?)</font>#', $str, $cap); var_dump($cap); ?>
↓結果
array(2) {
[0]=>
string(65) "<font color="red"><font size="3">フォントカラー赤:サイズ3</font>"
[1]=>
string(40) "<font size="3">フォントカラー赤:サイズ3"
}
最短マッチでは意図した結果にならない
<?php $str = '<font color="red"><font size="3">フォントカラー赤:サイズ3</font></font>'; preg_match('#<font\s+.*?>((?!<font\s+.*?>).*?)</font>#', $str, $cap); var_dump($cap); ?>
↓結果
array(2) {
[0]=>
string(72) "<font color="red"><font size="3">フォントカラー赤:サイズ3</font></font>"
[1]=>
string(25) "フォントカラー赤:サイズ3"
}
$str = '<font color="red">ほげほげ<font size="3">フォントカラー赤:サイズ3</font></font>';
のように fontの開始タグの間に「ほげほげ」とあった場合。下記の結果になってしまう。
array(2) { [0]=> string(73) "<font color="red">ほげほげ<font size="3">フォントカラー赤:サイズ3</font>" [1]=> string(48) "ほげほげ<font size="3">フォントカラー赤:サイズ3" }
<?php $str = '<font color="red">ほげほげ<font size="3">フォントカラー赤:サイズ3</font></font>'; preg_match('#<font\s+.*?>((?!.*<font\s+.*?>).*?)</font>#', $str, $cap); var_dump($cap); ?>
↓結果
array(2) {
[0]=>
string(73) "<font color="red">ほげほげ<font size="3">フォントカラー赤:サイズ3</font>"
[1]=>
string(25) "フォントカラー赤:サイズ3"
}
これで望み通りの結果になる。
ポイント
preg_match('#<font\s+.*?>((?!.*<font\s+.*?>).*?)</font>#', $str, $cap);
^^
「.*」を入れて、0文字以上の任意の文字列を許可するのがポイント