Grep 類別以正則表達式從 HTML/文本中提取或替換三類內容:
<a href="url">...</a>admin@domain.com<img src="image.jpg"><?php
class Grep {
private $_pattern = [
'url' => '/<a.*?href="((http(s)?:\/\/).*?)".*?/si',
'email' => '/([\w\-\.]+@[\w\-\.]+(\.\w+))/',
'image' => '/<img.*?src="([^"]+\.(jpg|jpeg|gif|bmp|png))"/i'
];
private $_content = '';
public function set($content) { $this->_content = $content; }
public function get($type) {
if (!isset($this->_pattern[$type])) return [];
preg_match_all($this->_pattern[$type], $this->_content, $matches);
return $matches[1] ?? [];
}
public function replace($type, $replacement) {
if (!isset($this->_pattern[$type])) return $this->_content;
return preg_replace($this->_pattern[$type], $replacement, $this->_content);
}
}
$html = '<a href="https://example.com">Link</a> Contact: test@mail.com <img src="photo.jpg">';
$grep = new Grep();
$grep->set($html);
print_r($grep->get('url')); // ['https://example.com']
print_r($grep->get('email')); // ['test@mail.com']
print_r($grep->get('image')); // ['photo.jpg']
// 替換:將所有連結指向代理
$safeHtml = $grep->replace('url', '<a href="/proxy?url=$1">$1</a>');
| 類型 | 正則 | 捕獲組 |
|---|---|---|
| URL | /<a.*?href="((http(s)?:\/\/).*?)".*?/si | 完整 URL (含協議) |
/([\w\-\.]+@[\w\-\.]+(\.\w+))/ | 完整 Email | |
| Image | /<img.*?src="([^"]+\.(jpg|jpeg|gif|bmp|png))"/i | 圖片 URL |
href='...'。srcset、data-src 等現代屬性。DOMDocument 解析器備選,處理巢狀/不標準 HTML 更健壯。callback 替換模式,允許動態計算替換值。Grep 以極簡封裝滿足常見內容提取/替換需求。正則雖快但難以覆蓋所有 HTML 邊界案例,關鍵系統建議引入 DOMDocument 或 Masterminds/HTML5-Parser 以換取解析可靠性。