以 < and ending with > 开头的 preg_replace() 模式找不到预期的 HTML 注释 [重复]

问题描述 投票:0回答:4

我正在尝试在这里运行一个脚本。 我确实将一些内容放入变量

$x
中。
$x
充满了html代码。 现在我想替换/删除所有 html 注释并将其写入文件。

我有这个正则表达式:

<!--([\s\S]*?)-->
。 它在编辑器或 www.phpliveregex.com 中运行良好。 但在我的 php 中却没有。 也许你可以帮我。

//$x = content
$summary2 = preg_replace("<!--([\s\S]*?)-->", "", $x);
fwrite($fh, $summary2);

编辑: 这是我想要删除的内容的一些示例。

</ul>
<p>
	Evaluation<!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG />
<o:TargetScreenSize>1024x768</o:TargetScreenSize>
</o:OfficeDocumentSettings>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:HyphenationZone>21</w:HyphenationZone>
<w:PunctuationKerning />
<w:ValidateAgainstSchemas />
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:Compatibility>
<w:BreakWrappedTables />
<w:SnapToGridInCell />
<w:WrapTextWithPunct />
<w:UseAsianBreakRules />
<w:DontGrowAutofit />
</w:Compatibility>
</w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" LatentStyleCount="156">
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Normale Tabelle";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]--></p>
<ul>
	<li>

php regex preg-replace
4个回答
3
投票

什么是正则表达式?

表达字符串或模式的符号和字符序列 在较长的文本中进行搜索。

什么是分隔符?

使用 PCRE 函数时,要求模式为 由分隔符括起来。分隔符可以是任何非字母数字, 非反斜杠、非空白字符。

哪对字符可以用作分隔符?

常用的分隔符是正斜杠 (/)、井号 (#) 和波形符 (~)。

也可以使用括号样式分隔符,其中左括号和右括号分别是开始和结束分隔符。 ()、{}、[] 和 <> 都是有效的括号样式分隔符对。

我的情况呢
<!--([\s\S]*?)-->

因此,顺便说一句,您的正则表达式内部有分隔符,其中以

<
开头并以
>
字符结尾,相应地,您的正则表达式模式将是
!--([\s\S]*?)--
,这可能不是您想要的。

我该怎么办?

将其包含在一对分隔符内。例如。

/<!--([\s\S]*?)-->/

有效果吗?

现场查看

这是一个好的做法吗?

不,不是!从来没有(但为了不撒谎,我有时会这样做!)! 正则表达式不是为了修改 HTML/XML 元素。为了这个特定目的,你应该选择

DOMDocument
类,这将使你的生活更加轻松和干净:

$dom = new DOMDocument();
$dom->loadHtml($str, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
foreach ($xpath->query('//comment()') as $comment) {
    $comment->parentNode->removeChild($comment);
}
echo $dom->saveHTML();

现场查看


0
投票

由于您使用 < and > 作为分隔符,因此您应该对它们进行转义以将其从字符串中删除:

$summary2 = preg_replace("<\<!--([\s\S]*?)--\>>", "", $x);

0
投票

首先,你忘记添加分隔符了。

通常,当您没有分隔符时会发出警告,因为它被视为正则表达式语法错误。 但在您的特定情况下,不会生成警告,因为您可以使用 < and > 作为分隔符。您也可以使用 { }。 由于您的 < and > 被视为分隔符,因此您的正则表达式显然不再符合您的预期。

通常,不带分隔符的正则表达式可以在测试站点中使用,因为分隔符是自动管理的,无需处理它。这无疑解释了为什么您的正则表达式在您测试它的网站上按原样工作。

其次,我建议将

[\s\S]*?
替换为
.*?
并使用 s 选项。更容易理解您要匹配的内容。


0
投票

在 PHP 中,您需要从

preg_replace()
返回字符串,它不适用于原始字符串。所以这可以完美地工作(也可以在这里查看演示,在下半部分)。正如评论中提到的,您还需要添加一些分隔符(在我的例子中
~
):

<?php
$string = '</ul>
<p>
    Evaluation<!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG />
<o:TargetScreenSize>1024x768</o:TargetScreenSize>
</o:OfficeDocumentSettings>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:HyphenationZone>21</w:HyphenationZone>
<w:PunctuationKerning />
<w:ValidateAgainstSchemas />
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:Compatibility>
<w:BreakWrappedTables />
<w:SnapToGridInCell />
<w:WrapTextWithPunct />
<w:UseAsianBreakRules />
<w:DontGrowAutofit />
</w:Compatibility>
</w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" LatentStyleCount="156">
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Normale Tabelle";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]--></p>
<ul>
    <li>';

$regex = '~<!--([\s\S]*?)-->~';
$replacement = '';
$newString = preg_replace($regex, $replacement, $string);
echo $newString;

?>
© www.soinside.com 2019 - 2024. All rights reserved.