繁体   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