2017年1月14日土曜日

PHP / なかなか身につかないPHP

Code IQでHTMLのスクレイピングの問題が出ていたので、PHPで書いてみた。
課題はクリアできなく、振り返りです。

<?php
$input =  trim(fgets(STDIN) )  ;
$th = array();
$td = array();
while ( $input ) {
    // echo $input . "\n";
    preg_match('/^<th>(.*)<\/th>$/', $input, $match_th);
    preg_match('/^<td>(.*)<\/td>$/', $input, $match_td);
    // var_dump($match);
    if ($match_th ) $th[] =  preg_replace('/<\w*>/', '' , $match_th[1] );
    if ($match_td ) $td[] =  preg_replace('/<\/?\w*>/', '' , $match_td[1] );
    $input =  trim(fgets(STDIN) ) ;
}

printCsv($th);
printCsv($td);


function printCsv($array) {
    foreach ($array as $key => $var ) {
        echo "\"" . $var . "\"";
        if ( $key < count($array) -1 ) {
            echo ",";
        } else {
            echo "\n";
        }
    }
}



function e($target){
    return htmlspecialchars($target, ENT_QUOTES);
}
?>


メモ

trim(fgets(STDIN) )
標準入力の読み込みと両端スペースの消去

preg_match(regex_str or regex_array, str or array, $store);
パターンマッチした行とグループ化した部分を$storeに格納する

preg_replace(regex_str, inserted_str , target_str );
target_str内でregex_strに対応する部分をinserted_strに置き換える。
preg_matchと同様にregex_strとinserted_strは配列でも構わない

count($array)

PHPの配列の要素数のカウントを思い出せずググった次第です




foreach ($array as $key => $var ) {

同じく

htmlspecialchars($target, ENT_QUOTES);

同じく

fputcsv(output , array [, delimitter[, enclosure[, escape_char] ] ] )

配列をcsvで出力する
enclosureがつくルールがわからず、今回は使えず

0 件のコメント:

コメントを投稿