2011-08-15 13 views
2

私はスクリプト内get_meta_tags()を使用していますし、特定のURLにそれは(一例として)...get_meta_tags()とリダイレクトの制限に関するエラー処理?

警告でアウト失敗:get_meta_tags(http://www.kodak.com/)[ function.get-meta-tags]:ストリームを開けませんでした:リダイレクトの上限に達しました...

エラーをスローする結果をスキップすることはできますか?あるいは、代わりに@get_meta_tags()を使うべきですか?

function getMeta() 
{ 
    $tags = get_meta_tags($this->link); //INSERT INTEGRITY CHECK HERE? 
    $keywords = $tags['keywords']; 

    if(count($keywords)) 
    { 
     preg_match_all('/(?<=^|,)\s*((?:[^\s,]+\s*){1,4})(?=\s*(?:,|$))/', $keywords, $m); 
     $this->keywords = array_slice($m[1], 0, 15); 
    } 
} 

答えて

2

get_meta_tags()の呼び出しの直前にerror suppression operator - the @ characterを使用することができます。これは、その行のすべてのエラー報告をオフにする効果がありますが、通常は悪い習慣とみなされ、他のオプションがすべて使い果たされた場合にのみ使用されます。例えば、リンクをhttp://www.php.net/manual/en/language.types.array.phpではなくhttp://php.net/arrayに:あなたはリダイレクトチェーンの最後にURLを渡すようにしてください、すなわち - 可能な場合は、これに

あなたの最初の反応はget_meta_tags()に正規のURLを渡すためにしようとするべきです。 $this-linkがあなたのコントロールの外にソースから来る場合は、しかし、エラーの抑制を使用すると、あなたの最善の策かもしれません:

次のようにあなたがそれを使用することができます:

$tags = @get_meta_tags($this->link); 

を。これは、機能的にこれと同じである。

$errorLevel = error_reporting(0); 
$tags = get_meta_tags($this->link); 
error_reporting($errorLevel); 

メタタグの配列を含まない変数$tagsを処理するには、残りのコードを変更する必要があります。

+0

のために正確なものを探しているん。私はその正統的な問題だとは思わないが、その縛られたリンクは完全にうまく整えている(www.kodak.com)、いいえ? – RegEdit

+0

@RegEdit - 「標準的なリンク」とは、「リダイレクトチェーンの最後のリンク」を意味します。あなたがkodak.comに行くと、あなたの場所が検出され、ローカライズされたサイトにリダイレクトされ、それから別の場所にリダイレクトされる可能性があります。正規のリンクは、最終ページに移動したときに最終的にブラウザに表示されるURLです。基本的には、リダイレクトを制限し、リダイレクト制限に達するのを止め、エラーが投げられないようにすることを指示しています。あなたがそれを行うことができない場合は、次の最良の選択肢は、単にエラーを無視することです。 – AgentConundrum

+0

@RegEdit - スクリーンスクレイピングでURLを引っ張っている場合、リダイレクトについてはほとんどできませんので、おそらく '@'を使用する必要があります。他の唯一のオプションは 'set_error_handler()'を使って独自のエラーハンドラをセットアップしてエラーを例外に変換し、try-catchブロックで 'get_meta_tags()'コールを実行してキャッチをチェックして、リダイレクトの上限に達しました。これは、エラー抑制演算子を使用するのとほぼ同じですが、抑制したいエラーを抑制するだけのボーナスが追加されています。それはここで非常に過度の可能性があります。 – AgentConundrum

1

私はエラー抑制の使用に同意しませんが、いくつかの例外がありますが便利です。

function getMeta() 
{ 
    if ($tags = @get_meta_tags($this->link)) { 
     $keywords = $tags['keywords']; 

     if (count($keywords)) { 
      preg_match_all('/(?<=^|,)\s*((?:[^\s,]+\s*){1,4})(?=\s*(?:,|$))/', $keywords, $m); 
      $this->keywords = array_slice($m[1], 0, 15); 
     } 
    } else { 
     // Catch error 
    } 
} 

@エラー抑制が すべてエラーを抑制しますので注意してだけではなく、限界値を超えリダイレクト。 See docs

0

この1つはすべてのエラーを抑制しますが、リンクが与えられた検索クエリに対してGoogle検索の画面スクレイプから来ている

function getMeta() 
{ 
    $tags = @get_meta_tags($this->link); //INSERT INTEGRITY CHECK HERE? 
    if (!$tags){ 
     //handle your error 
    } 

    $keywords = $tags['keywords']; 

    if(count($keywords)) 
    { 
     preg_match_all('/(?<=^|,)\s*((?:[^\s,]+\s*){1,4})(?=\s*(?:,|$))/', $keywords, $m); 
     $this->keywords = array_slice($m[1], 0, 15); 
    } 
} 
関連する問題