php 删除 2 个标签之间的空格

php remove whitespace between 2 tags

我试图在将邮件插入数据库之前删除电子邮件的签名。签名附在一个特殊的标签里,xxx 帮助剥离。

以下内容仅在签名被压缩且没有空格分布在各行时才有效。

    $msgeBody = preg_replace('#(<signature>).*?(</signature>)#', '', $msgeBody);

我尝试了在网上找到的可能性,在应用上面的行之前先删除这些标签之间的空格。但没有成功。怎么做?这是分布在多行中的示例文本:-

    <signature><p><span style="font-weight: bold;">Gerald Sugan</span><br>
    Travel Consultant<br>
    <span style="font-size: 18px; font-family: 'Courier New'; font-weight: bold;">Sugan Enterprises Inc</span></p>
    </signature>

php preg_replace regex that matches multiple lines 的解决方案不是重复的。我在这里看不到如何应用这些解决方案。我认为下面找到的解决方案是不同的。

尝试使用 Trim() /函数删除您指定的空格或字符/:

http://www.w3schools.com/php/func_string_trim.asp

Explode 会将签名与电子邮件正文分开,这是一段很短的代码,但您需要删除最后一个遗留的标签。

要回答原始查询 chop($yourString, ' ' ) 应该删除 $yourString 中的所有空格参考:http://php.net/manual/en/function.chop.php

您的电子邮件保存在一个名为 $msgeBody 的变量中,因此将其拆分为 "signature" 和 trim 剩余标签。

   $msgeBody = explode("signature", $msgeBody);
   $msgeBody = rtrim($msgeBody[0], "<");

在将其放入数据库之前清理 $msgeBody

使用 $msgeBody = explode("signature", $msgeBody); 将 "signature" 中的第一个 < 留在第一部分的末尾 - 电子邮件的正文 - 将位于数组位置 $msgeBody[0] .

str_replace('<','', $msgeBody[0]); 也会删除该标签,但如果您在 $msgeBody 中有其他标签,它也会删除这些标签。

rtrim($msgeBody[0], "<"); 应该更好地删除它。 substr() 也有可能 http://php.net/manual/en/function.substr.php 并且会找到第一次出现的 ''

rtrim($msgeBody,'<signature>'); 也可能会把它砍掉,但马里亚诺对多重签名有警告。未测试。

strip_tags($msgeBody, ''); 将删除所有可以使用的标签。 (你把任何你想保留的标签放在 '' 中——例如在 '<br />' 中。)

您可以使用 DOMDocument:

$mail= <<<'EOD'
<body>
blah blah blah
<signature><p><span style="font-weight: bold;">Gerald Sugan</span><br>
    Travel Consultant<br>
 <span style="font-size: 18px; font-family: 'Courier New'; font-weight: bold;">Sugan Enterprises Inc</span></p>
    </signature>
blah blah blah
</body>
EOD;

libxml_use_internal_errors(true);

$dom = new DOMDocument;
$dom->loadHTML($mail, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

foreach ($dom->getElementsByTagName('signature') as $node) {
    $node->parentNode->removeChild($node);
}

echo $dom->saveHTML();

这是一个与您的签名匹配的简单正则表达式:<signature>[\S\s]*<\/signature>

\S :匹配 space、制表符或换行符以外的任何内容。
\s :匹配任何 space、制表符或换行符。
* : 匹配零个或多个连续字符。