2012-02-11 3 views
2

オフセット、ここに私のコードは次のとおりです。お知らせを返しするpreg_match:不定私はトレントPHPクローラを作ってるんだと私は問題を抱えている

// ... the cURL codes (they're working) ... 
// Contents of the Page 
$contents = curl_exec($crawler->curl); 

// Find the Title 
$pattern = "/<title>(.*?)<\/title>/s"; 
preg_match($pattern, $contents, $titlematches); 
echo "Title - ".$titlematches[1]."<br/>"; 

// Find the Category 
$pattern = "/Тип<\/td><td(?>[^>]+)>((?>[^<]+))<\/td>/s"; 
preg_match($pattern, $contents, $categorymatches); 
echo "Category - ".$categorymatches[1]."<br/>"; 

HTMLページ(「Типは」カテゴリーと「Филмиは」作品を意味意味):

は、
<title>The Matrix</title> 
<!--Some Codes Here--!> 
<tr><td>Тип</td><td valign="top" align=left>Филми</td></tr> 
<!--Some Codes Here--!> 

結果:

Title - The Matrix 
Notice: Undefined offset: 1 in /var/www/spider.php on line 117 

なぜそれが..ですタイトルではなく、カテゴリを示すのか? 私は$categorymatches[0]$categorymatches[2]$categorymatches[3]を幸運にも反響させようとしました。

+0

これは 'contents'は' categorymatches'のための一致を作成しないことを意味します。また、 ' - !'ではなく ' - >'でコメントが閉じられます。 ' –

+0

' $ contents'は正しいHTMLデータを保持しません。 'curl_exec()'の直後にそれをエコーし​​、何が現れているのかを見てください。あなたが提供したHTMLを使ってローカルで試してみましたが、うまくいきました。 – entropid

答えて

5

あなたは、preg_matchが実際に一致していると仮定しています。もしそうなら、テストする方が良いでしょう。あなたがするpreg_matchでスイッチまたは2を使用する場合があります

$pattern = "/<title>(.*?)<\/title>/s"; 
$matchCount = preg_match($pattern, $contents, $titlematches); 
if ($matchCount > 0) { 
    echo $titlematches[1]."<br/>"; 
} else { 
    // do something else, 'cos no match found 
} 

注:「タイトル」が使用される場合にのみ、ない「TITLE」または「タイトル」の結果を見つけますので、大文字と小文字を区別しないを使用して/私は考え方かもしれない。タグが値と異なる行にあり、タグが行にある可能性があります。したがって、マルチラインスイッチ/ mは便利です。

と同じ原理がすべてのあなたのするpreg_matchチェックに

EDIT

を適用することは、あなたのカテゴリの一致がUTF-8文字列をテストしているかのように見えるので、/ uは

を切り替えて使用してみてください
+0

問題は文字セットにありました - 私はちょうどcrawler.phpをANSIに変換しています。現在クロールするページはWindows-1251エンコーディングのページです:)ありがとうございます! –

+0

これは 'if($ matchCount> 0)' - >一致するものではないでしょうか? – Urs

関連する問題