错误:
警告:preg_match_all()[function.preg-match-all]:第23行/Users/julian/Sites/abc.php中的未知修饰符'g' 警告: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 :(得分:5)
你缺乏分隔符。正确的正则表达是:
↓ ↓
~<img([^>]+)/>~i
~<a([^>]+)>(.*?)</a>~i
↑ ↑
但请注意,通常不建议使用正则表达式解析HTML。相反,您可以考虑使用DOM。
注意:PHP中的未知修饰符'g'如果您想要所有匹配项,那么您只需使用g modifier代替preg_match_all()
<{3}}。
答案 1 :(得分: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);