Предупреждение: preg_match_all () [function.preg-match-all]: Неизвестный модификатор 'g'

Ошибки:

Предупреждение: preg_match_all () [function.preg-match-all]: Неизвестный модификатор 'g' в /Users/julian/Sites/abc.php в строке 23 Предупреждение: preg_match_all () [function.preg-match-all]: Неизвестно модификатор 'g' в /Users/julian/Sites/abc.php в строке 23

Вот мой код:

<?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;
?>

person Community    schedule 19.01.2011    source источник
comment
не могли бы вы сделать отступ в коде, чтобы он был удобочитаемым?   -  person jlasarte    schedule 19.01.2011
comment
В вашем регулярном выражении нет разделителей. Окружите их /../   -  person Orbling    schedule 19.01.2011


Ответы (2)


Вам не хватает разделителей. Правильные регулярные выражения:

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

Но имейте в виду, что обычно не рекомендуется анализировать HTML с помощью регулярных выражений. Вместо этого вы можете рассмотреть возможность использования DOM.

Примечание. Неизвестный модификатор 'g' в PHP отсутствует модификатор g, вы просто используете вместо него preg_match_all() из preg_match(), если вам нужны все совпадения.

person NikiC    schedule 19.01.2011
comment
Хотя я не рекомендую анализировать HTML с помощью регулярных выражений (это невозможно), это довольно смелое заявление. Все зависит от ситуации, следует ли использовать регулярное выражение или DOM, и, по крайней мере, это даже близко не невозможно. Regexp очень эффективен как для синтаксического анализа, так и для сегментации и проверки при правильном использовании. - person Geoffrey Wagner; 19.01.2011
comment
@Geoffrey: Не думайте, что я типичный идиот, который говорит, что вы не должны использовать регулярное выражение только потому, что он не может понять синтаксис. Я полностью осведомлен о возможностях регулярного выражения: обратные ссылки, просмотр вперед, просмотр назад и рекурсия - мощные инструменты. Но алгоритм синтаксического анализа, определенный стандартом HTML5, слишком сложен, чтобы его можно было охватить с помощью регулярного выражения. Ванильный XML, вероятно, может быть правильно проанализирован с использованием регулярного выражения, но в большинстве случаев сломанный HTML на большинстве веб-страниц определенно не может. - person NikiC; 19.01.2011
comment
Я никогда не хотел называть тебя идиотом. Я просто хотел прояснить всем, кто это читает, не сбрасывайте регулярное выражение со скидкой для своих нужд. Это очень мощное и непроверенное мнение, такое как (это невозможно) без ситуативных случаев для обеих сторон (потому что парсер DOM тоже крут!), Приведет будущих читателей по одному пути, когда другой может работать так же хорошо или даже лучше. . - person Geoffrey Wagner; 19.01.2011

Попробуй это:

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);
person jlasarte    schedule 19.01.2011
comment
… И не используйте htmlspecialchars(), если вы действительно не ищете "img ..." (кстати, вы не найдете его на главной странице Googles). - person rik; 19.01.2011