質問

データベースからレコードを抽出し、テキストのみのHTMLページに保存しました。各レコードはaに保存されます <p> パラグラフフィールドとラインブレイクで区切られています <br /> そしてラインhr>. 。例えば:

Company Name<br/>
555-555-555<br />
Address Line 1<br />
Address Line 2<br />
Website: www.example.com<br />

これらのレコードをCSVファイルに配置する必要があります。使った fputcsv array()およびfile_get_contents()と組み合わせて、Webページのソースコード全体を.csvファイルに読み取り、データも欠落していました。これらは、同じ形式で保存されている複数のレコードです。したがって、上記のようにレコードブロック全体の後、それは <hr> ラインタグ。以下に示すように、名前の列、電話番号、電話番号、アドレス列へのアドレス、ウェブサイトの列へのアドレスの名前を読みたいです。

http://i.stack.imgur.com/00gxw.png
これどうやってするの?

HTMLのスニペット:

            1 Stop Signs<br />
            480-961-7446<br />
500 N. 56th Street<br />
        Chandler, AZ  85226<br />

<br />
                Website: www.1stopsigns.com<br />
            <br />
            </p><br /><hr><br />

HTMLのソースでは、このように間隔を空けています。

役に立ちましたか?

解決

上記のHTMLがよく形成されていると仮定すると、この問題に対する私のアプローチは2つのフェーズでなければなりません。初め。 HTMLテキストを少しクリアして、情報をエクスポートまたは管理するのにより効率的です。ここでは、近い将来、必要としないことを知っているものを保存して削除したいアイテムをクリアしてみてください。

$html = preg_replace("|\s{2,}|si"," ",$html); // clear non neccesary spaces
$html = preg_replace("|\n{2,}|si","\n",$html); // convert more return line to only one
$html = preg_replace("|<br />|si","##",$html); // replace those tags with this one

そうすれば、これに似たよりきれいなHTMLがあります。

1 Stop Signs##
480-961-7446##
500 N. 56th Street##
Chandler, AZ  85226##
Website: www.1stopsigns.com##
##
</p>##<hr>##

2番。これで、フィールドを爆発させたり、コンマ別の値に内破してCSVを形成できます

// here you'll have the fields to work with into the array called $csv_parts
$csv_parts = explode("##",$html);

// imploding, so there you have the formatted csv similar to 1 Stop Signs,480-961-7446,..
$csv = implode(",",$csv_parts);

これで、フィールドを抽出するか、CSVをエクスポートするためにHTMLを操作する2つの方法があります。


これが役立つことを願っています。

他のヒント

データがすべてのレコードが分離されているパターンに従うと仮定すると <hr> タグと内部のすべてのフィールドはaによって分離されます <br /> その後、データを分割できるはずです。

これを行う方法はたくさんありますが、使用する素朴な方法があります explode() 次のようなものかもしれません:

// open a file pointer to csv
$fp = fopen('records.csv', 'w');

// first, split each record into a separate array element
$records = explode('<hr>', $str);

// then iterate over this array
foreach ($records as $record) {

    // strip tags and trim enclosing whitespace
    $stripped = trim(strip_tags($record));

    // explode by end-of-line
    $fields = explode(PHP_EOL, $stripped);

    // array walk over each field and trim whitespace
    array_walk($fields, function(&$field) {
        $field = trim($field);
    });

    // create row
    $row = array(
        $fields[0], // name
        $fields[1], // phone
        sprintf('%s, %s', $fields[2], $fields[3]), // address
        $fields[6], // web
    );

    // write cleaned array of fields to csv
    fputcsv($fp, $row);
}

// done
fclose($fp);

どこ $str あなたが解析しているページデータです。お役に立てれば。

編集

もともと特定のフィールド要件に気づかなかった。例を更新しました。

最も簡単な方法は、単にブロックを取り、からすべてをドロップすることです。 <hr> 前方にタグを付けてから、文字列を文字列配列として分割します <br /> タグ。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top