プロが教える店舗&オフィスのセキュリティ対策術

preg_match_allで複数条件を設定する方法についてお尋ねします。

環境
PHP:5.1.6
MySQL:5.0.77

--------ソース例------------------------------------------
<a href="1000/23">1: 【国語】接続後について (授業1) (20)</a>
<a href="1000/26">2: 【数学】分数 (206)</a>
---------------------------------------------------------

上記のようなHTMLソースを分解してMySQLに登録することを考えています。

(1行目)
1000/23 | 1 | 【国語】接続後について (授業1) | 20

(2行目)
1000/26 | 2 | 【数学】分数 | 206

という形に
a hrefの中身 |スレッド番号 | タイトル | コメント数
4つに分解してMySQLに登録します。

正規表現を学んで、個別にデータを取り出すことはできました。
以下に作成したソースを記載します。

$contents='<a href="1000/23">1: 【国語】接続後について (授業1) (20)</a><a href="1000/26">2: 【数学】分数 (206)</a>';
preg_match_all( '/<a href="(.*?)">/su', $contents, $match );

foreach ( $match[ 1 ] as $var )
{
echo htmlspecialchars($var)."<br>";
}

preg_match_all( '/">([0-9]*?):/su', $contents, $match2 );
foreach ( $match2[ 1 ] as $var2 )
{
echo htmlspecialchars($var2)."■<br>";
}


preg_match_all( '/[0-9]: (.*?)\([0-9]*\)<\/a>/su', $contents, $match3 );
foreach ( $match3[ 1 ] as $var3 )
{
echo htmlspecialchars($var3)."■<br>";
}

preg_match_all( '/\(([0-9]*?)\)</su', $contents, $match4 );
foreach ( $match4[ 1 ] as $var4 )
{
echo htmlspecialchars($var4)."●<br>";
}

【実行結果】
1000/23
1000/26
1
2
【国語】接続後について (授業1)
【数学】分数
20
206

1行ずつMySQLに登録したいので
preg_match_all( '/条件1,条件2,条件3,条件4/su', $contents, $match );
のような形で指定して個々の値を下記の変数に入れることは可能でしょうか?

ループ処理開始{
$url $num $title $res
//MySQLに接続
//データ登録
}

A 回答 (1件)

こんな感じでどうでしょ?



<?PHP
$contents='<a href="1000/23">1: 【国語】接続後について (授業1) (20)</a><a href="1000/26">2: 【数学】分数 (206)</a>';
$pattern='/<a href="(.*?)">(\d)+:(.*?)\((\d+)\)<\/a>/mis';
if(preg_match_all($pattern , $contents, $matches,PREG_SET_ORDER )){
foreach($matches as $match){
$sql ="INSERT IGNORE INTO テーブル (`url`,`num`,`title`,`res`) VALUES(";
$sql.= "'".mysql_real_escape_string($match[1])."'";
$sql.=",'".mysql_real_escape_string($match[2])."'";
$sql.=",'".mysql_real_escape_string($match[3])."'";
$sql.=",'".mysql_real_escape_string($match[4])."')";;
print $sql."<br>\n";
}
};
?>

この回答への補足

yambejpさん。

回答ありがとうございます。
条件設定の()内が順番に配列に入るというやり方があるんですね。
勉強になります!


上記ソースを実行してみましたが
結果が
INSERT IGNORE INTO テーブル (`url`,`num`,`title`,`res`) VALUES('','','','')
INSERT IGNORE INTO テーブル (`url`,`num`,`title`,`res`) VALUES('','','','')
という形でVALUESの部分に何も表示されません。
お手数ですがもう一度ソースの確認お願いできますでしょうか?

あと、
$pattern='/<a href="(.*?)">(\d)+:(.*?)\((\d+)\)<\/a>/mis';
の最後のmisの意味ですが、

m →文字列を複数行として扱う。
i →大文字と小文字を区別しない。
s →文字列を単一行として扱う。
という個々の意味はわかるのですが、
mとsを記載するということは
「文字列を複数行として扱う。」「文字列を単一行として扱う。」となり、文字列を「単一行としても複数行としても扱う」という理解でよろしいのでしょうか?
misをsimと順序を入れ替えると結果が変わったりするものなのでしょうか?

補足日時:2011/11/22 20:00
    • good
    • 0
この回答へのお礼

$pattern='/<a href="(.*?)">(\d)+:(.*?)\((\d+)\)<\/a>/mis';
の部分を自分で書き換えてみたところ希望通りの動作となりました。

ありがとうございました。

お礼日時:2011/11/26 19:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!