簡體   English   中英

我如何刪除其他 </html> 使用正則表達式從字符串中標記?

[英]how can I remove additional </html> tag from string using regular expression?

我正在使用php DOMDocument替換節點,然后重寫頁面。 回寫的HTML是純文本(不是HTML),因此我必須像這樣轉換它:

$content = files::readFile($data['page_path']);
$content = str_replace('&lt;', '<', $content);
$content = str_replace('&gt;', '>', $content);

if (!@fwrite($handle, $content))
{
    print 'Failed to replace entities';
    return FALSE;
}

這使HTML成為正確的HTML,但是出於某種奇怪的原因,它在文檔底部添加了額外的</ html>標簽,在令人討厭的</ html>標簽之后添加了一些其他數據。 我完全不知道為什么。

無論如何,我考慮過使用:

$content = preg_replace('#\<\/head\>*(:alphanum:)#', '</html>', $content);

刪除它,但這與我認為的方式不符。

請幫助!

測試示例:

$html = '
   <div id="footer">
       <div class="wrap">
           <strong class="logo"><a href="#">College</a></strong>
           <ul><li><a href="#">Emergencies</a></li>
               <li><a href="#">Contact</a></li>
               <li><a href="#">Copyright</a></li>
               <li><a href="#">Terms of Use</a></li>
               <li><a href="#">Member of The Colleges</a></li>
           </ul><p>© 2010 College</p>
       </div>
   </div>
</body></html>
li>
               <li><a href="#">Contact</a></li>
               <li><a href="#">Copyright</a></li>
               <li><a href="#">Terms of Use</a></li>
               <li><a href="#">Member of The Colleges</a></li>
           </ul><p>© 2010 College</p>
       </div>
   </div>
</body></html>';

preg_match("#</head>.*#si", $html, $matches);
var_dump($matches);

您的代碼:

$content = preg_replace('#\<\/head\>*(:alphanum:)#', '</html>', $content);

之所以不起作用,是因為:alphanum:在PREG樣式的正則表達式中不是有效的語法。 PHP的ereg風格的regex函數中允許使用此類字符類,但已棄用了這些函數,因此您應堅持使用PREG。

解決方案是用正確的PREG語法替換:alphanum: :。

對於:alphanum: [0-9a-zA-Z]正確的語法是[0-9a-zA-Z]

對於任何數字字符,還有\\d類的快捷方式,可以代替0-9來使用。 有關這些的更多信息,請參見http://www.regular-expressions.info/reference.html

[編輯]

現在,您有了:

$content = preg_replace('#\<\/head\>*([0-9a-zA-Z])#', '</html>', $content);

正如您所說,這仍然行不通,但至少可以解決明顯的問題。

第一個問題:您在正則表達式中輸入了“”,但是您似乎要求替換“”之后的所有內容-“”是拼寫錯誤嗎?

第二點:正則表達式[0-9a-zA-Z]僅匹配一個字符。 要匹配多個字符,您需要在[0-9a-zA-Z]之后添加+* 加號表示您要匹配[0-9a-zA-Z]中的一個或多個,而星號表示零個或多個出現。

第三點:您在問題中引用的代碼不僅僅包含字母數字字符。 它是HTML,因此包含尖括號,#符號,甚至包括版權符號。 顯然[0-9a-zA-Z]不會與其中任何一個匹配( :alphanum:使用ereg語法也不會)。

您可以將代碼中可能出現的所有字符添加到正則表達式中,以生成類似[0-9a-zA-Z<>#] ,但這可能不切實際。 一個更好的主意是匹配任何字符,而不是專門尋找字母數字。 要匹配任何字符,您將使用點( . ),因此您的正則表達式將更像這樣:

$content = preg_replace('#</html>.+#', '</html>', $content);

希望能有所幫助。

我不確定確切的字母數字字符是否適合該問題,但是我懷疑您希望在字母數字字符后加上*通配符以匹配任意數量的它們:

$content = preg_replace('#</head>[\da-z]*#i', '</html>', $content);

實際上,我想知道您是否甚至想匹配</head>標記后的所有內容,在這種情況下,它可能對您有用:

$content = preg_replace('#</head>.*#si', '</html>', $content);

編輯:現在您已經添加了示例文本,我看到您有2 </html>標記。 怎么樣:

$content = preg_replace('#</html>.*#si', '</html>', $content); 

我遇到的問題已解決:我發現可重用內容中遇到了奇怪的錯誤! 在使用模式“ r +”時,我在使用PHP函數fwrite()時發現了問題。 如果您在php.net/fopen上看到了有關此功能的文檔,則將看到r +執行以下操作: 將文件指針放在文件的開頭。 我天真地認為這意味着由於指針位於開頭,因此它將覆蓋整個文件內容。 不,實際上這不是事實。 如果需要這種效果,則必須使用模式“ w”,該模式將執行以下操作: 將文件指針放在文件的開頭,並將文件截斷為零長度。 如果該文件不存在,請嘗試創建它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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