我试图在这里运行一个脚本。
我确实将一些内容放入变量$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>
&#13;
答案 0 :(得分:3)
表示字符串或模式的符号和字符序列 在较长的文本中搜索。
使用PCRE功能时,需要使用模式 由分隔符括起来。分隔符可以是任何非字母数字, 非反斜杠,非空白字符。
经常使用的分隔符是正斜杠(/),井号(#)和波浪号(〜)。
也可以使用括号样式分隔符,其中开始和结束括号分别是起始和结束分隔符。 (),{},[]和&lt;&gt;都是有效的括号样式分隔符对。
<!--([\s\S]*?)-->
怎么办?因此,您的RegEx顺便提一下,其中的分隔符正在开始<
和结束>
个字符,相应地您的RegEx模式将是!--([\s\S]*?)--
,这可能不是您想要的。
将其包裹在一对分隔符中。例如。 /<!--([\s\S]*?)-->/
不,不是!永远不会(但不要撒谎我有时会这样做!)! Regular Expressions are not made to modify HTML/XML elements。你应该去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();
答案 1 :(得分:0)
因为你使用&lt;和&gt;作为分隔符,你应该想要转义它们以从字符串中删除它们:
$summary2 = preg_replace("<\<!--([\s\S]*?)--\>>", "", $x);
答案 2 :(得分:0)
首先,您忘了添加分隔符。
通常,当您没有分隔符时会发出警告,因为它被视为正则表达式语法错误。 但在您的特定情况下,不会生成警告,因为您可以使用&lt;和&gt;作为分隔符。你也可以使用{}。 因为你的&lt;和&gt;被视为分隔符,你的正则表达式显然不符合你的期望。
通常,没有分隔符的regexp可以在测试站点中运行,因为分隔符是自动管理的,无需处理它。这无疑解释了为什么你的正则表达式在你测试它的网站上工作。
其次,我建议将[\s\S]*?
替换为.*?
并使用 s 选项。您可以更轻松地理解您要匹配的内容。
答案 3 :(得分:0)
在PHP中,您需要从preg_replace()
返回字符串,它不适用于原始字符串。所以这完美无缺(see a demo here as well,在下半部分)。如评论中所提到的,您还需要添加一些分隔符(在我的情况下为~
):
<?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;
?>