Php 如何删除附加的</html>;使用正则表达式从字符串中标记?

Php 如何删除附加的</html>;使用正则表达式从字符串中标记?,php,preg-replace,domdocument,Php,Preg Replace,Domdocument,我正在使用php DOMDocument替换一个节点,然后重写页面。写回的HTML是纯文本(不是HTML),因此我必须像这样转换它: $content = files::readFile($data['page_path']); $content = str_replace('&lt;', '<', $content); $content = str_replace('&gt;', '>', $content); if (!@fwrite($handle, $con

我正在使用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;
}
$content=files::readFile($data['page\u path']);
$content=str_replace(“”,,$content);
如果(!@fwrite($handle,$content))
{
打印“未能替换实体”;
返回FALSE;
}
这使得HTML非常合适,但是,出于一些奇怪的原因,它在文档底部添加了一个额外的标记,并在有问题的标记之后添加了一些额外的数据。我完全不知道为什么

无论如何,我考虑过使用:

$content = preg_replace('#\<\/head\>*(:alphanum:)#', '</html>', $content);
$content=preg\u replace('\\*(:alphanum:)\','$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);
$html='1!'

©2010学院

李>
  • ©2010学院

    '; preg#u match(“#。*#si”,$html,$matches); var_dump($matches);
    您的代码:

    $content = preg_replace('#\<\/head\>*(:alphanum:)#', '</html>', $content);
    
    正如你所说,这仍然不起作用,但至少解决了明显的问题

    第一个问题:您在正则表达式中有“”,但您似乎要求替换“”之后的所有内容-“”是一个拼写错误吗

    第二点:正则表达式只匹配一个字符。要匹配多个字符,您需要在
    [0-9a-zA-Z]
    之后添加
    +
    *
    。加号表示要匹配一个或多个
    [0-9a-zA-Z]
    ,而星号表示零或多个发生

    第三点:你在问题中引用的代码不仅仅包括字母数字字符。它是HTML,所以它包括尖括号、#-符号,甚至是版权符号。显然,
    [0-9a-zA-Z]
    与它们中的任何一个都不匹配(使用ereg语法,
    :alphanum:

    您可以将代码中可能出现的所有字符添加到正则表达式中,以生成类似于
    [0-9a-zA-Z#]
    的内容,但这可能并不实用。更好的办法是匹配任何字符,而不是专门寻找字母数字。要匹配任何字符,可以使用点(
    ),因此正则表达式看起来更像:

    $content = preg_replace('#</html>.+#', '</html>', $content);
    
    $content=preg#u replace(“#.+#,”,“$content”);
    

    希望这会有所帮助。

    我不确定字母数字字符到底如何与问题相匹配,但我怀疑您希望字母数字字符后面有*通配符,以便匹配任意数量的字符:

    $content = preg_replace('#</head>[\da-z]*#i', '</html>', $content);
    
    $content=preg#u replace(“#[\da-z]*#i”、“$content”);
    
    事实上,我想知道您是否希望匹配
    标记之后的所有内容,在这种情况下,这可能对您有用:

    $content = preg_replace('#</head>.*#si', '</html>', $content);
    
    $content=preg#u replace(“#.*si”,“$content”);
    
    编辑:现在您已经添加了示例文本,我看到您有2个
    标记。那么:

    $content = preg_replace('#</html>.*#si', '</html>', $content); 
    
    $content=preg#u replace(“#.*si”,“$content”);
    
    我遇到的问题已经解决:
    我发现了我在可重用内容中遇到的奇怪错误!在使用模式“r+”时,我在使用PHP函数fwrite()时发现了这个问题。如果您在php.net/fopen上看到此函数的文档,您将看到r+执行以下操作:openforreading和write;将文件指针放在文件的开头。我天真地认为,这意味着由于指针位于开头,它将覆盖整个文件内容。不,事实上这不是事实。如果你想达到这种效果,你必须使用“w”模式,它可以做到以下几点:只为写作而打开;将文件指针放在文件的开头,并将文件截断为零长度。如果文件不存在,请尝试创建它。

    (工具)$content=preg\u replace('.\\*([0-9a-zA-Z])),'.$content);也不起作用。@syn4k-我没有停下来寻找正则表达式的其他问题,因为这是最明显的问题。我再看一眼,然后编辑答案。。。。等等……谢谢,但它不起作用。我将在上面的代码中发布一个示例。
    $content = preg_replace('#</html>.*#si', '</html>', $content);