PHP preg_match_all関数での配列のMysqlへの格納方法

このQ&Aのポイント
  • PHP初心者の方が、preg_match_all関数を使って正規表現でマッチングする際に、マッチング結果をMysqlに格納したいと思っています。
  • preg_match_all関数を使用すると、マッチング結果が多次元配列となって出力されます。それをそれぞれのレコードに分けてMysqlに格納する方法について質問しています。
  • 現在のコードでは、マッチング結果の配列がbenriカラムにArray[2]という文字列として格納されてしまいます。マッチングした文字列そのものをMysqlに格納する方法についてのアドバイスをお願いします。
回答を見る
  • ベストアンサー

PHP preg_match_all関数の配列をMysqlに格納したい

PHP preg_match_all関数の配列をMysqlに格納したい PHP初心者です。 preg_march_all関数を使って正規表現でマッチングする練習を行っています。 preg_march_allを使った場合、マッチングした結果が多次元配列となって出力されると思うのですが、それらをそれぞれのレコードに分けてMysqlに格納したいと思っています。 php入門サイトのものを弄って作ったのですが、 while (! feof($fp)) { $s = fgets($fp); $n = preg_match_all($Pattern, $s, $ar, PREG_SET_ORDER); for ($i = 0; $i < $n; $i++) mysql_query("insert into seikihyougen1 (benri) value ('$ar[$i][2]')"); } 結果はマッチングした数のレコード分、benriカラムにArray[2]という文字列が入力されてしまいます。 これらをマッチングした文字列に直してMysqlに入れるにはどうすればよいのでしょうか?

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • smileeeen
  • ベストアンサー率70% (21/30)
回答No.1

ダブルクォーテーション内で多次元配列の変数を展開する場合、 どこからどこまでが変数かを示すために波括弧{}で変数を括る必要があります。 mysql_query("insert into seikihyougen1 (benri) value ('{$ar[$i][2]}')"); また、$Patternにはどのようなパターンが記述されているのでしょうか。 特に()で括られた部分がないのであれば、 $ar[$i][2] ではなく $ar[$i][1] ではないでしょうか。 http://php.net/manual/ja/function.preg-match-all.php さらにマッチした文字列を直接SQLに挿入するのは危険なので mysql_real_escape_string関数などを使ってエスケープを施すべきだと思います。 http://www.php.net/manual/ja/function.mysql-real-escape-string.php

jirokita
質問者

お礼

お礼が遅れてしまい申し訳ありませんでした。 >ダブルクォーテーション内で多次元配列の変数を展開する場合、 どこからどこまでが変数かを示すために波括弧{}で変数を括る必要があります。 こんな方法があるとは知りませんでした、まだ勉強不足ですね・・・ また、mysql_real_escape_string関数の件も教えていただきありがとうございました。

関連するQ&A

  • preg_match_all関数でaタグの属性を

    PHPのpreg_match_all関数でaタグの属性hrefの値だけをすべて取得するにはどうしたらよいでしょう?? 正規表現の部分が分かりません。 お願いします。

    • ベストアンサー
    • PHP
  • PHP:preg_match_allで複数条件指定

    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に接続 //データ登録 }

    • ベストアンサー
    • PHP
  • preg_match_allで取得データをDBへ

    質問:preg_match_allで取得したデータをDBへ格納したいです。 記述文 $pattern = "|HREF=.*?\>|"; preg_match_all($pattern,$str,$match); 補足: $pattern で指定範囲を書いてます。 $str には $patternでとってくる参照データ先が入ってきます。 print_r($match); で念のためブラウザに吐き出すと Array ( [0] => Array ( [0] => HREF="AAA"> [1] => HREF="../../../../Top"> 以下省略 取得したい範囲が取れていることは確認できました。 目的は、とってきた [0] => HREF="AAA"> [1] => HREF="../../../../Top"> : =>より先の文字列が、DBの1つのレコードに1つずつ入っていくイメージです。 アドバイスよろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP 二次元配列から値を抜き出したい

    PHP 二次元配列から値を抜き出したい こんにちは。 PHP初心者です。(PHP5使用) ある二次元配列から値を抜き出したいのですが、方法を教えていただけないでしょうか? 文字列: "TransactionId=000000020513&TransactionDate=20101029&OperateId=1Auth&MerchantFree1=20101029000001&ResponseCd=G65" この文字列から、 $pattern="/(TransactionId|TransactionDate|OperateId|MerchantFree1|ProcessId|ProcessPass|ResponseCd|CompanyCd|ApproveNo)=(.+?)(?:&|$)/"; preg_match_all($pattern,$response_list,$match); print "<pre>"; print_r($match); print "</pre>"; で$match変数に以下のように値が、 $match[0][0]・・・TransactionId=000000020513& $match[0][1]・・・TransactionDate=20101029& ・ ・ $match[1][0]・・・TransactionId $match[1][1]・・・TransactionDate ・ ・ $match[2][0]・・・000000020513 $match[2][1]・・・20101029 ・ ・ という二次元配列に格納されます。 そこで、 $match[1][0]・・・TransactionId と $match[2][0]・・・000000020513 を関連付けて、 "TransactionId" という文字列をそのまま変数名「$TransactionId」として、 $TransactionId = "000000020513" という形で格納していきたいのです。(文字列にある項目全て同じ形にしたいです。) 元の文字列の並びが変化したり、ケースによって作られない項目もあるので、 知っている知識だけではどうしたら良いのか困っています。 ご教授の程、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 正規表現 preg_match_all 

    $c = preg_match_all('@href="/Top/World/Japanese/(?P<query>.*?)">(?:<b>|)(?P<cate>.*?)(?:</b>|)</a>@s', $buf,$match,PREG_SET_ORDER); print_r($match); の(?:<b>|)と(?:</b>|)の部分がまちがっているので、<b></b>タグがあってもなくてもいい場合にマッチさせることができないと思っています。 どうか教えてくださいませ。 ちなみにPHPの5.2.2です。

    • ベストアンサー
    • PHP
  • マッチした郵便番号のみを配列に格納したい

    テキストファイルから郵便番号のみを 抽出したいと考えています。 欲しいのは該当した郵便番号のみの一覧なのですが 下記プログラムではマッチした行が 配列として格納されてしまいます。 $naiyou = file("textfile.txt"); for($i=0;$i<sizeof($naiyou);$i++){ if(preg_match("/\d{3}-\d{4}","$naiyou[$i]")){ $naiyou[$i]=$naiyou[$i]."\n"; array_push($result,$naiyou[$i]); } } マッチした数字のみを配列に格納するには どうすればいいのでしょういか?

    • ベストアンサー
    • PHP
  • PHPで配列に格納されたデータを表示させるには。

    PHPで配列に格納されたデータを表示させるには。 全ての配列の要素を表示させることは下のようにすればできるのはわかります。 <?php for($i=0;$i<sizeof($data);$i++){ echo $data[$i]; echo "<br>"; } ?> 配列の0~9まで(10個)をまず表示させて、「次へ」のようなリンクで次の10~19までを表示させるようにしたいのですが、どのようにすればよいのでしょうか。

    • ベストアンサー
    • PHP
  • preg_match_allによる文字列切り出しについて

    preg_match_allによる文字列切り出しについて 宜しくお願い致します。 $data[0] = "あいうえおかきくけこ2011年2月3日さしすせそ"; $data[1] = "あいうえおかきくけこ2014/5/6さしすせそ"; $data[2] = "あいうえおかきくけこ2017-8-9さしすせそ"; $data[3] = "あいうえおかきくけこ2010.11.12さしすせそ"; $data[4] = "あいうえおかきくけこ13時-14時さしすせそ"; というデータから日付だけを抽出し、切った場所で配列に収めたいと考えております。 自分なりに考えたパターンは、 for($x = 0; $x < count($data); $x++) { preg_match_all("/\\d{4}[\-\/\.|年]|\\d{1,2}[\-\/\.|月]|\\d{1,2}/u",$data[$x],$data_array); print $data_array[0][0]; print $data_array[0][1]; print $data_array[0][2]; print "<br>"; } これを実行すると、下記の出力になってしまいます。 2011年2月3 2014/5/6 2017-8-9 2010.11.12 1314 ファイルの文字コードは「UTF-8」です。 最後の「1314」は$data[4]の「13時-14時」の部分が切り出されてしまい、ここは無視して欲しいのです。 この部分で数時間悩んでおり、いい加減、気持ち悪くなってきました。 またまたお願いで大変申し訳ないのですが、どなたか助けてくださいー ( iдi )

    • ベストアンサー
    • PHP
  • mysqlを配列でjavascriptにinputする

    今、大学の研究で多言語チャットをphp、javascript、mysqlで作っているのですが、mysqlに入っているデータをどのようにしてjavascriptに配列で読み込ませるのかわかりません。どんなことでもいいので教えてください。ちなみに、mysqlにはtable名:english中身はno:番号words:使う文章となっています。またphpによりmysqlリストはjavascriptに読み込めていると思います。 できたら、配列で格納した後に検索をしなければならないのでそれをわかる人はそのことについても書いてくれるとうれしいです。

  • 別のファイルにあるレコードを各配列に格納したいです

    ファイル"DATA.dat"にあるレコードを配列"Record"にそれぞれ格納するプログラム考えてみましたが、なかなか動いてくれません。何かアドバイスをください。 DATA.datの内容 0001 0010 0011 0100 0101 : : Record配列にレコードを格納するイメージ Record[0] <- 0001 Record[1] <- 0010 Record[2] <- 0011 Record[3] <- 0100 Record[4] <- 0101     :     : 考えたプログラム #include <stdio.h> #include <stdlib.h> void main() { FILE *File_pt; char Record[100]; int i; //TimeLineファイルをOpenする if ( (File_pt = fopen("DATA.dat", "r")) != NULL){ for(i = 0 ; i < 5 ; i++){ if( (fscanf(File_pt, "%s", Record[i])) == EOF){ printf("各レコード格納失敗\n"); exit(1); } } //////格納されたレコードを表示する for(i = 0 ; i < 5 ; i++){ printf("%s\n",Record[i]); } fclose(File_pt); }else{ printf("失敗\n"); exit(1); } } まだ初心者なんでおねがいします。

専門家に質問してみよう