PHP preg_replace()不起作用

PHP preg_replace()不起作用,php,regex,preg-replace,Php,Regex,Preg Replace,我想在这里运行一个脚本。 我确实在变量$x中放入了一些内容。 $x充满了html代码。 现在我想替换/删除所有html注释并将其写入文件 我有一个正则表达式:。 它在编辑器或www.phpliveregex.com上运行良好。 但在我的php中,它不是。 也许你能帮我 //$x = content $summary2 = preg_replace("<!--([\s\S]*?)-->", "", $x); fwrite($fh, $summary2); /$x=内容 $summar

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

我有一个正则表达式:
。 它在编辑器或www.phpliveregex.com上运行良好。 但在我的php中,它不是。 也许你能帮我

//$x = content
$summary2 = preg_replace("<!--([\s\S]*?)-->", "", $x);
fwrite($fh, $summary2);
/$x=内容
$summary2=preg_replace(“,”,$x);
fwrite($fh,$summary2);
编辑: 这是我想摆脱的内容的一些例子



评价


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

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

$summary2=preg\u replace(首先,您忘了添加分隔符

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

通常,不带定界符的regexp在测试站点中工作,因为定界符是自动管理的,而不必处理它。这当然解释了为什么您的regex在测试它的站点上工作

其次,我建议将
[\s\s]*?
替换为
*?
,并使用s选项。更容易理解您试图匹配的内容。

什么是正则表达式? 一系列符号和字符,表示要输入的字符串或模式 在较长的文本中搜索

什么是分隔符? 使用PCRE功能时,要求图案为 由分隔符括起。分隔符可以是任何非字母数字, 非反斜杠、非空白字符

哪对字符可以用作分隔符? 常用的分隔符有正斜杠(/)、散列符号(#)和波浪号(~)

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

我的案子怎么样? 因此,顺便提一下,您的正则表达式中有分隔符,分隔符的开头是
和结尾是
字符,相应地,您的正则表达式模式将是
!-([\s\s]*?)-
,这可能不是您想要的

我该怎么办? 将其包装在一对分隔符内。例如,
/

它有用吗?

这是一种好的做法吗? 不,不是!永远不要(但为了不撒谎,我有时会这样做!)。你应该使用
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();

在PHP中,您需要从
preg_replace()
返回字符串,它对原始字符串不起作用。因此这可以完美地工作(,在下半部分)。正如注释中提到的,您还需要添加一些分隔符(在我的例子中,
~
):


至少你似乎缺少任何分隔符。在
/
@JonStirling中包围正则表达式的内容-更糟糕的是:
实际上充当分隔符]@lvaroGonzález:好的观点!当你在PHP中编辑HTML代码时,你不应该使用正则表达式,而是使用DOM。这里你可以看到一段代码关于如何使用DOM的示例他没有使用
作为分隔符,他忘记了分隔符。这是有道理的,但到目前为止还没有改变结果。感谢您的解释。但是这个正则表达式不会得到我想要的结果。(?s)但是我也会添加一个解释(不作用于原始字符串)(+1).
<?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;

?>