PHP preg_replace()不会工作

时间:2015-12-23 09:53:24

标签: php regex preg-replace

我试图在这里运行一个脚本。 我确实将一些内容放入变量$x$x充满了html代码。 现在我想替换/删除所有html注释并将其写入文件。

我有这个正则表达式:<!--([\s\S]*?)-->。 它在编辑器或www.phpliveregex.com上运行良好。 但在我的PHP中它并没有。 也许你可以帮助我。

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

编辑: 这是我想要摆脱的内容的一些例子。

&#13;
&#13;
</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;
&#13;
&#13;

4 个答案:

答案 0 :(得分:3)

什么是正则表达式?

  

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

什么是分隔符?

  

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

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

  

经常使用的分隔符是正斜杠(/),井号(#)和波浪号(〜)。

     

也可以使用括号样式分隔符,其中开始和结束括号分别是起始和结束分隔符。 (),{},[]和&lt;&gt;都是有效的括号样式分隔符对。

我的案例<!--([\s\S]*?)-->怎么办?

因此,您的RegEx顺便提一下,其中的分隔符正在开始<和结束>个字符,相应地您的RegEx模式将是!--([\s\S]*?)--,这可能不是您想要的。

我该怎么办?

将其包裹在一对分隔符中。例如。 /<!--([\s\S]*?)-->/

有效吗?

Check it live

这是一个好习惯吗?

不,不是!永远不会(但不要撒谎我有时会这样做!)! 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();

Check it live

答案 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;

?>