2011-01-19 10 views
0

エラー:警告:preg_match_all()function.pregマッチ-ALL]:不明修飾子 'G'

警告:preg_match_all()function.pregマッチ-ALL]:不明修飾子「G '/Users/julian/Sites/abc.php 23行目 警告:preg_match_all()[function.preg-match-all]:行23の/Users/julian/Sites/abc.phpの未知の修飾子' g 'ここで

私のコードです:

<?php 

class Crawler { 
protected $markup = ”; 
    public function __construct($uri) { 
     $this->markup = $this->getMarkup($uri); 
    } 
    public function getMarkup($uri) { 
     return file_get_contents($uri); 
    } 
    public function get($type) { 
     $method = "_get_links"; 
     if (method_exists($this, $method)) 
       return call_user_method($method, $this); 
      } 
    } 
    protected function _get_images() { 
     if (!empty($this->markup)){ 
      preg_match_all(htmlspecialchars("<img([^>]+)/>i"), $this->markup, $images); 
      return $images[1]; 
    } 
    } 
    protected function _get_links() { 
     if (!empty($this->markup)){ 
      preg_match_all(htmlspecialchars("<a([^>]+)>(.*?)</a>/i"), $this->markup, $links); 
      return $links; 
     } 
    } 
} 
$crawl = new Crawler("http://google.com/"); 
$images = $crawl->get(‘images’); 
$links = $crawl->get(‘links’); 
echo $links; 
?> 
+0

あなたのコードをインデントして読みやすくすることはできますか? – jlasarte

+0

あなたはすべてインデントされます。 –

+0

固定フォーマットです。 – NikiC

答えて

5

デリミタがありません。正しい正規表現は次のとおりです。

↓    ↓ 
~<img([^>]+)/>~i 
~<a([^>]+)>(.*?)</a>~i 
↑     ↑ 

ただし、正規表現を使用してHTMLを解析することは一般的に推奨されていません。代わりに、DOMの使用を検討することもできます。

注:不明修飾子「G」 PHPでノーがあるg modifierあなたはすべての試合をしたい場合は、あなただけのpreg_match_all()の代わりpreg_match()を使用しています。

+0

"正規表現でHTMLを解析することはお勧めしませんが(不可能です)"というのはかなり大胆な声明です。正規表現やDOMを使うべきかどうかはまったく完全な状況であり、少なくとも不可能ではありません。 Regexpは、正しく使用された場合、構文解析、セグメント化、および検証の両方に対して非常に強力です。 –

+0

@ Geoffrey:正規表現を使うことができないという理由だけで正規表現を使用すべきではないと言っている典型的なばかだとは思わないでください。私は完全に正規表現の可能性を認識しています:逆参照、先読み、lookbehindと再帰は強力なツールです。しかし、HTML5標準で定義された解析アルゴリズムは、あまりにも複雑すぎて正規表現ではカバーできません。バニラXMLはおそらくregexを使って正しく解析されるかもしれませんが、ほとんどのWebページではほとんどHTMLが壊れているとは限りません。 – NikiC

+0

私はあなたのどんな馬鹿なことを暗示したことはありませんでした。私はちょうどあなたがこれを読んで誰にも明らかにしたい、あなたのニーズに正規表現を割引しないでください。これは非常に強力であり、両者の状況的な事例がない(不可能である)などの未検証の意見である(DOMパーサも揺れているので)将来の読者が一方的な道を導き、他方がうまくいくか、 。 –

1

試してみてください:

class Crawler { 

protected $markup = ”; 
public function __construct($uri) { 
    $this->markup = $this->getMarkup($uri); 
} 
public function getMarkup($uri) { 
    return file_get_contents($uri); 
} 
public function get($type) { 
    $method = "_get_links"; 
    if (method_exists($this, $method)){ 

     return call_user_method($method, $this); 
    } 
} 
protected function _get_images() { 
    if (!empty($this->markup)){ 
     preg_match_all("/<img([^>]+)\/>/i", $this->markup, $images); 
     return $images[1]; 
} 
} 
protected function _get_links() { 
    if (!empty($this->markup)){ 
     preg_match_all("/<a([^>]+)\>(.*?)\<\/a\>/i", $this->markup, $links); 
     return $links; 
    } 
} 
} 
$crawl = new Crawler("http://google.com/"); 
$images = $crawl->get(‘images’); 
$links = $crawl->get(‘links’); 
print_r($links); 
+0

私はまだエラーが発生します! –

+0

うん、あなたは正しい。私はそれを編集させてください。 – jlasarte

+0

...実際に '< img ... >'を検索しない限り、 'htmlspecialchars()'は使用しないでください(これはGooglesのフロントページbtwにありません)。 – rik

関連する問題