PHPのpreg_match関数について質問です。


現在正規表現にてデータを抜き取っているのですが、うまくデータを抜き取ることができません。

preg_match関数の定型を作っていただいたのですが、

preg_match('|<td> (.*?) </td>|', $html, $matches);


'| がデータの始まりで (.*?)が抜き取りたいデータ |'がデータの終わり , 抜き取りたいデータが入っている変数, 結果を入れる変数)

と認識しております。

やろうとしていた事ですが、

自分がデータベースへ保存したHTMLデータを一度変数に入れてそれを正規表現で抜き取ろうとしています。
(会員制サイトでしたので自分でHTMLを直接データベースへ一度保存しています。)

データベースからきちんとHTMLを変数に入れているのですが、正規表現後の各データを変数に保存できない状況です。

echo文で出力したのですが 何も表示されません(空白です。)

もし時間がある人おりましたらスクリプトを一度見ていただけないでしょうか。

お手数をおかけしますがよろしくお願いいたします。

回答の条件
  • 1人2回まで
  • 登録:2009/09/23 20:20:35
  • 終了:2009/09/24 21:24:03

ベストアンサー

id:GoldenDawn No.2

GoldenDawn回答回数426ベストアンサー獲得回数812009/09/23 21:08:55

ポイント100pt

場合によってはさらに手直しの必要があるかと思いますが、二ケ所の preg_match に関して

<?php
preg_match('|<tr class="odd">.*?<td align="left"><strong>終了数</strong></td>.*?<td align="right">(.*?)</td>|s', $html, $matches) ;
// 改行に関する処理を追加
<?php
preg_match('|<td align="left"><strong>総落札額\(円\)</strong></td>.*?<td align="right">(.*?)</td>|s', $html, $matches) ;
// カッコをエスケープ
// データにない文字を削除
id:aiomock

ご回答ありがとうございます。

実行できました。

改行されているところは .*? を使って

改行されているところのデータを取るときは 最後の l を ls にするということですね^^。

ご回答いただき本当にありがとうございます。

2009/09/23 21:25:12

その他の回答(1件)

id:iser No.1

iser回答回数110ベストアンサー獲得回数02009/09/23 21:01:17

ポイント35pt

正規表現のパターン文字列は|で囲むのではなくて/では?

http://jp.php.net/manual/ja/function.preg-match.php

id:aiomock

ご回答ありがとうございます。

2009/09/23 21:13:01
id:GoldenDawn No.2

GoldenDawn回答回数426ベストアンサー獲得回数812009/09/23 21:08:55ここでベストアンサー

ポイント100pt

場合によってはさらに手直しの必要があるかと思いますが、二ケ所の preg_match に関して

<?php
preg_match('|<tr class="odd">.*?<td align="left"><strong>終了数</strong></td>.*?<td align="right">(.*?)</td>|s', $html, $matches) ;
// 改行に関する処理を追加
<?php
preg_match('|<td align="left"><strong>総落札額\(円\)</strong></td>.*?<td align="right">(.*?)</td>|s', $html, $matches) ;
// カッコをエスケープ
// データにない文字を削除
id:aiomock

ご回答ありがとうございます。

実行できました。

改行されているところは .*? を使って

改行されているところのデータを取るときは 最後の l を ls にするということですね^^。

ご回答いただき本当にありがとうございます。

2009/09/23 21:25:12
  • id:aiomock
    環境のバージョンですが以下のようになります。

    phpMyAdmin - 2.11.9.5

    MySQL : 4.0.27

  • id:aiomock
    以下がスクリプトになります。

    <?php

    require "database_connect.php";


    //ブランド・商品調査

    if(isset($_POST["submit1"])){

    require "database_connect.php";

    $sql=mysql_query("select * from MARKETING_BRAND");
    if(!$sql){echo "失敗です";}


    while ($row = mysql_fetch_array($sql, MYSQL_ASSOC)) {

    $html = $row["HTML"];


    // - 情報収集実行 - 

    //概要

    preg_match('|<tr class="odd"><td align="left"><strong>終了数</strong></td><td align="right">(.*?)</td>|', $html, $matches);
    $syuuryou = $matches[1];

    preg_match('|<td align="left"><strong>総落札額(円)</strong></td><td align="right">(.*?) 円</td>|', $html, $matches);
    $uriage = strtr($matches[1], array("," => ""));


    echo $syuuryou;
    echo $uriage;

    }

    }



    ?>
    <html>

    <head>

    </head>
    <body>
    <FORM method="POST"action="<?php echo $_SERVER['PHP_SELF'];?>">
    マーケティング調査

    <br><br>


    ★ブランド・商品調査
    <br><br>
    <input type="submit" name="submit1" name="情報を収集する">


    </form>
    </body>
    </html>
  • id:aiomock
    以下が 保存したHTMLの一部になります。

    <h3 class="titles">概 要&nbsp;<span><a href="/about.html#about_1" target="_blank"><img src="/img/icon_help.gif" /></a></span></h3>

    <div class="charts">
    <table class="data_tbl">
    <tr class="odd">
    <td align="left"><strong>終了数</strong></td>
    <td align="right">506</td>
    <td align="left"><strong>総落札額(円)</strong></td>
    <td align="right">718,382</td>

  • id:aiomock
    $html = $row["HTML"];

    まではきちんとデータが入っているところまで確認できました。

    なので個人的にはpreg_match関数のところがおかしいのではと考えているのですが、

    もしわかるかたおりましたらよろしくお願いいたします。

  • id:makeworld
    すみません。前回の回答で説明不足でした。
    正規表現の最初と最後につけている記号('|')は、バックスラッシュ('\')と英数字以外の任意の文字を使用できます。

    普通はスラッシュ('/')を使いますが、正規表現中にスラッシュが出てくる場合、毎回そのスラッシュの前にバックスラッシュを付ける必要があり、コードが見辛くなるので他の文字('|')を使用しました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません