0

私は、Webサイトをスクレイプして値を返すだけの単純なアプリケーションを作成しようとしている、初心者のプログラマーです。

簡単だと思っていたのですが、探してみたところ、諦めて聞いてしまいました。

スクレーパーを使用して、 $ title1$ title2、および$title3の3つの変数を返します。すべての$titleは、記事の名前を見つけようとする私のさまざまな方法から来ています。理想的には、1つを探して実行する必要がありますが、一部のWebサイトでは、データの保存方法が異なります(メタタグ、非表示のdiv、要素などを使用するものもあります)。

次の擬似コードを実行する方法が必要です。

if $title1, $title2, $title3 != null { // don't count a string if it is null

    $title1_stringlength = string_length($title1) //find string length of the $titles
    $title2_stringlength = string_length($title2)
    $title3_stringlength = string_length($title3)

    $realtitle = $lowestvalueofstringlength; // $realtitle gets whichever $title is shortest in length, not counting any null $title's

}

これが私がこれをする必要がある理由の例です:

echo $title1; //echoes "Exercise Daily"
echo $title2; //echoes "null"
echo $title3; //echoes "Exercise Daily - And More advice on SaveTheTwinkie.org"
$realtitle = $title1;//should be $title1 because it was shortest that wasn't null

//or a different example from another site

echo $title1; //echoes "Wow look at this Article Title!"
echo $title2; //echoes "null"
echo $title3; //echoes "Wow look at this Article Title! - from StupidArticles.tv"
$realtitle = $title1;//should be $title1 because it was shortest that wasn't null

したがって、私のコードは文字列の長さの中で最も短い$ title(nullではない)を探し、その値を$realtitleに与えます。

助けてくれてありがとう!詳細が必要な場合は、お問い合わせください。


編集


これが私の完全なコードです:$titleの1つが""になるまで機能し、その後$realtitleも""になります

<?php

$sites_html = file_get_contents($url);

$html = new DOMDocument();
@$html->loadHTML($sites_html);
$title1 = null; //reset
$title2 = null; //reset
$title3 = null; //reset

//Get all meta tags and loop through them.
foreach($html->getElementsByTagName('meta') as $meta) {
    if($meta->getAttribute('property')=='og:title'){ 
        //Assign the value from content attribute to $title1
        $title1 = $meta->getAttribute('content');
    }
}
foreach($html->getElementsByTagName('h1') as $div) {
    if($div->getAttribute('itemprop')=='name'){
        $title2 = $div->nodeValue;
    }
}
foreach($html->getElementsByTagName('h1') as $div) {
    if($div->getAttribute('class')=='fn'){
        $title3 = $div->nodeValue;
    }
}

$realtitle = array_reduce(array($title2, $title1, $title3), function($a, $b) {
    return strlen($a) && $a != 'null' && strlen($a) < strlen($b) ? $a : $b;
}, null);

    echo 'metaogtitle: '.$title1 . '<br/><br/><br/><br/><br/>';
    echo 'name: '.$title2. '<br/><br/><br/><br/><br/>';
    echo 'name2: '.$title3. '<br/><br/><br/><br/><br/>';
    echo 'realtitle: '.$realtitle. '<br/><br/><br/><br/><br/>';
?>
4

3 に答える 3

2
// Filter invalid values
$titles = array_filter($titles, function($title) { return $title && $title != 'null'; }); 
// Just  sort :)
usort ($titles, function ($left, $right) { return strlen($left) - strlen($right); });
echo $titles[0];
于 2013-01-06T22:02:56.550 に答える
1

無制限の数の文字列で機能するバリアントは次のとおりです。

$shortest = NULL;

$shortestReduce = function ($string) use (&$shortest) {

    if ( ($string === "null") || !($len = strlen($string))) {
        return $shortest;
    }

    if (!isset($shortest) || $len < strlen($shortest)) {
        $shortest = $string;
    }

    return $shortest;
};

$shortestReduce($string1);
$shortestReduce($string2);
$shortestReduce($string3);
# ...

echo $shortest; # "Exercise Daily"

このreduceを使用すると、同じ関数を複数の値に適用して1つの結果を生成できます。ここでは、ではない最短の文字列です"null"

于 2013-01-06T22:23:46.473 に答える
0

これはうまくいくはずです:

function real_title($titles) {
    /* Gets array of titles.
       Return the shortest that isn't null.
    */

    $min_length = strlen($titles[0]);
    $real_title = $titles[0];

    foreach ($titles as $single_title) {
       $title_length = strlen($single_title);
       if (($title_length < $min_length) && ($title_length > 0)) {
                $min_length = $title_length;
                $real_title = $single_title;
        }
    }

    return $real_title;
}
于 2013-01-06T22:03:33.253 に答える