[英]preg_match pattern to find the contents of a string between <html> and </html> tags
我正在研究一個PHP腳本,該腳本讀取電子郵件的內容,並提取某些信息以存儲在數據庫中。
使用imap_fetchbody($ imap_stream,$ msg_number,1),我可以了解電子郵件的正文。 在某些情況下(尤其是從手機以SMS形式發送的電子郵件),電子郵件的主體如下所示:
===------=_Part_110734_170079945.1283532109852
Content-Type: text/html;charset=UTF-8;
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Multimedia Message</title>
</head>
<body leftmargin="0" topmargin="0">
<tr height="15" style="border-top: 1px solid #0F7BBC;">
<td>
SMS to email test
</td>
</tr>
</body>
</html>
------=_Part_110734_170079945.1283532109852--===
我想提取電子郵件的“內容”。 所以,我的計划是這樣的:
檢查正文是否包含“ html”標簽。 如果沒有,我可以正常閱讀(不是HTML電子郵件)。
如果是這樣,請提取“ html”標記之間的內容。 然后,消除所有其他HTML標記,剩下的就是“內容”。
但是,對於正則表達式模式,我一無所知。
我嘗試了這個:
$pattern = '/<html[^>]*>(.*?)<\/html>/i';
preg_match($pattern, $body, $matches);
// my 'content' should be in $matches[1]
但這是行不通的(可能是因為$ body包含換行符和其他空格)。 所以我嘗試了這個:
$pattern = '/<html[^>]*>([.\s]*?)<\/html>/i';
preg_match($pattern, $body, $matches);
但這也不起作用。
那么,我可以使用什么$ pattern來提取“ html”標簽之間的所有文本?
更新:我偶然發現了一種解決方法-首先刪除所有空白:
$body = preg_replace('/\s\s+/', ' ', $body);
$pattern = '/<body[^>]*>(.*?)<\/body>/';
我懷疑這不是最快或最有效的方法,但是它有效,並且是迄今為止我所能獲得的最好的方法。 不過,如果有一個更好的解決方案,我仍然會感激不盡。
更新2:感謝Gumbo的建議,我已經更加努力地研究了電子郵件的結構,以查找所需的部分,而不是嘗試對HTML進行正則表達式。 我終於找到了這個: http : //docstore.mik.ua/orelly/webprog/pcook/ch17_04.htm ,它解釋了如何完全按照我的需要做。
$pattern = '/<html[^>]*>([^\00]*?)<\/html>/i';
只有在內容中有0x00
字節(不應該是0x00
字節)的情況下,這才會中斷。
您可以使用html解析器,例如: http : //php-html.sourceforge.net/
或者您可以使用strip_tags php.net/strip_tags
[.\\s]
表示文字.
或空白字符。 您需要的是(.|\\s)
或[\\s\\S]
,或者您只需將s修飾符設置為具有.
還匹配換行符。
但是除此之外, 您不應該使用正則表達式來匹配HTML 。 HTML的各個部分不是正則的,因此您不能使用正則表達式來描述它。
但是除此之外,當您有不同的定界符時,您不應嘗試猜測多部分內容的范圍。 但是這些不是<html>…</html>
。 因為如果他們失蹤了怎么辦? 然后,您的嘗試將失敗。 使用消息本身定義的定界符: 邊界值。 因此,使用邊界獲取零件並在第一個CRLF + CRLF序列處將其拆分以將標頭與主體分離。
但是除此之外,為什么不使用IMAP函數獲取正文呢? 我對PHP的IMAP API不熟悉,但是可能有一個功能可以完全滿足您的需求。
您只需要添加s
修飾符即可.
匹配換行符:
$pattern = '/<html[^>]*>(.*?)<\/html>/si';
preg_match($pattern, $body, $matches);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.