首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 抓取遠端網頁內容與正則解析實作教學

     編輯:PHP 相關知識

使用 file() 或 file_get_contents() 取得遠端網頁內容,配合正則表達式提取所需資訊(如 <head> 區塊)。本文逐步示範抓取、合併陣列、正則解析全流程。

步驟 1:決定目標網址

<?php
$url = 'https://www.php.net';
?>

步驟 2:抓取內容到陣列

<?php
$lines = file($url); // 每行一個元素
?>

步驟 3:合併為單一字串

<?php
$content = implode('', $lines); // 空字串作分隔符直接連接
?>

步驟 4:正則提取 <head> 區塊

<?php
// 模式: 到  之間的所有內容 (含換行)
$pattern = '/(.*)<\/head>/is'; // i=忽略大小寫, s=單行模式 (點號匹配換行)
if (preg_match($pattern, $content, $matches)) {
    echo $matches[1]; // 第 1 捕獲組即為內容
} else {
    echo '未找到 head 區塊';
}
?>

完整整合範例

<?php
$url = 'https://www.php.net';
$lines = @file($url); // @ 抑制警告
if ($lines === false) {
    die('無法抓取遠端內容');
}
$content = implode('', $lines);
$pattern = '/(.*)<\/head>/is';
if (preg_match($pattern, $content, $matches)) {
    echo '<pre>';
    echo htmlspecialchars($matches[1]); // 安全輸出
    echo '</pre>';
} else {
    echo '解析失敗';
}
?>

進階:使用 cURL 更穩健

<?php
function fetchUrl($url) {
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_TIMEOUT => 10,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; PHP Bot)',
    ]);
    $content = curl_exec($ch);
    $errno = curl_errno($ch);
    curl_close($ch);
    if ($errno) return false;
    return $content;
}

$content = fetchUrl('https://www.php.net');
if ($content && preg_match('/(.*)<\/head>/is', $content, $m)) {
    echo htmlspecialchars($m[1]);
}
?>

正則表達式關鍵點

修飾符含義
i忽略大小寫
s單行模式:. 匹配換行符
m多行模式:^$ 匹配行首尾
U非貪婪模式:*? 最少匹配

重要提醒

  • 勿用正則解析 HTML:HTML 結構複雜、巢狀、屬性順序不固定,正則極易失效。請使用 DOMDocument、DOMXPath 或 QueryList 等專用解析器。
  • 尊重 robots.txt、設定合理 User-Agent、控制請求頻率。
  • 處理編碼:mb_convert_encoding($content, 'UTF-8', 'auto')。

現代解析範例

<?php
$dom = new DOMDocument();
@$dom->loadHTML($content); // @ 抑制 HTML5 標籤警告
$xpath = new DOMXPath($dom);
$head = $xpath->query('//head')->item(0);
if ($head) {
    echo $dom->saveHTML($head);
}
?>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved