1

allrecipes.com.を使用しているようなウェブサイトからレシピ情報を取得する簡単なアプリケーションを作成しましたpreg_matchが、何かが機能していません。

$geturl = file_get_contents("http://allrecipes.com/Recipe/Brown-Sugar-Smokies/Detail.aspx?src=rotd");
          preg_match('#<title>(.*) - Allrecipes.com</title>#', $geturl, $match);
          $name = $match[1];
          echo $name;

- Allrecipes.comページのタイトル (一部を除いたもの) を変数に入れようとしているだけですが、表示されるのはすべて空白です。

4

3 に答える 3

3

ページのソースを見ると<title>、実際のテキストの周りにパディングが含まれていることがわかります。これを補正する必要があります。

'#<title>\s*(.*) - Allrecipes.com\s*</title>#'
于 2012-12-23T17:18:47.313 に答える
2

このパターンには 2 つの問題がありました。<title>まず、によってキャプチャされなかった改行記号がありました.(/s修飾子なし.は文字通り「EOL 以外の任意の記号」であるため)。第二に、Allrecipes.comテキストの後に部分文字列が実際に続いていません</title>でした。それらを区切る改行がありました。

通常の空白と空白を区切る行の両方をカバーするという事実を考慮する\sと、次のように正規表現を変更できます。

'#<title>\s*(.*?) - Allrecipes.com\s*</title>#s'

/s\s*このレシピのタイトルは1行であり、すべての「\ n」記号は部分式でカバーされるため、修飾子は実際にはここでは関係ありません(それに気付いたミニテックに拍手) 。ただし、複数行のタイトルに不意を突かれないように、そのままにしておくことをお勧めします。

.*ここでは効率のために に置き換えまし.*?た。探している文字列は非常に短いため、ここでは貪欲でない量指定子を使用するのが理にかなっています。

于 2012-12-23T17:18:40.947 に答える
1

最初にタイトル全体を取得してから、次のように PHP を使用して削除する必要があります。

<?php

$raw_html=file_get_contents('http://www.allrecipes.com');
if (empty($raw_html)) {
    throw new \RuntimeException('Fetch empty');
}

$matches=array();
if (preg_match('/<title>(.*)<\/title>/s', $raw_html, $matches) === false) {
    throw new \RuntimeException('Regex error');
}

$title=trim($matches[1]);

// you should strip your title here
echo $title;
于 2012-12-23T17:49:51.100 に答える