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

时间:2015-11-20 23:57:36

标签: php regex preg-replace

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

以下仅适用于签名被压缩而没有空格分布在各行上的情况。

    $msgeBody = preg_replace('#(<signature>).*?(</signature>)#', '$1$2', $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的解决方案不重复。我在这里看不到如何应用这些解决方案。我认为下面找到的解决方案是不同的。

4 个答案:

答案 0 :(得分:2)

您可以使用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();

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

爆炸会将签名与电子邮件正文分开并且只是一小段代码,但您需要删除最后一个遗留标记。

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

您的电子邮件保存在名为$msgeBody的变量中,因此将其拆分为“签名”并删除其余标记。

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

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

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

str_replace('<','', $msgeBody[0]);也会移除代码,但如果$msgeBody中有其他代码,则会将其删除。

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

rtrim($msgeBody,'<signature>');也可能会将其删除,但Mariano对多个签名的警告。未经测试。

如果可以使用的话,

strip_tags($msgeBody, '');将删除所有标签。 (您可以在“''”中添加要保留的任何标记,例如“<br />”。