簡體   English   中英

preg_match模式以查找之間的字符串內容 <html> 和 </html> 標簽

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM