網頁採集中,常需從 HTML 中提取兩個標記之間的內容。本文提供一個健壯的 strCutByStr() 函數,支持多編碼、多組起止標記優先匹配、可選結束標記(截取到末尾)。
<?php
function strCutByStr(&$str, $findStart, $findEnd = false, $encoding = 'utf-8') {
// 支持數組批量嘗試:多組起止標記按順序嘗試,成功即返回
if (is_array($findStart)) {
if (count($findStart) === count($findEnd)) {
foreach ($findStart as $k => $v) {
if (($result = strCutByStr($str, $v, $findEnd[$k], $encoding)) !== false) {
return $result;
}
}
return false;
}
return false;
}
// 單組匹配邏輯
if (($start = mb_strpos($str, $findStart, 0, $encoding)) === false) {
return false;
}
$start += mb_strlen($findStart, $encoding); // 移至開始標記之後
if ($findEnd === false) {
return mb_substr($str, $start, NULL, $encoding); // 截取到末尾
}
if (($length = mb_strpos($str, $findEnd, $start, $encoding)) === false) {
return false;
}
return mb_substr($str, $start, $length - $start, $encoding);
}
$str = '1那是一場23我問問4567890維穩';
echo strCutByStr($str, '那些', '穩'); // 輸出:一場23我問問4567890維
// 多組備選:優先匹配第一組,失敗嘗試第二組
$starts = ['<div class="content">', '<article>'];
$ends = ['</div>', '</article>'];
echo strCutByStr($html, $starts, $ends);
mb_* 函數,完美支持 UTF-8/GBK 等編碼。&$str 避免大字符串複製,性能更優。$findEnd = false 時截取到字符串末尾。將此函數收入工具庫,採集項目中提取標題、正文、價格等字段將事半功倍。