2015-11-20 66 views
0

我想在将消息插入数据库之前删除电子邮件的签名。签名包含在一个特殊的标签xxx中,以帮助删除。php删除2个标签之间的空白

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

$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解决的办法是不重复的。我看不到如何在这里应用这些解决方案。我认为下面的解决方案是不同的。

+0

请勿使用'。+?'使用'[\ S \ s] +?',它将搜索非空白字符和空白字符。见这里https://regex101.com/r/wS0vX9/1 – Terminus

+0

肯尼,不知道如何适应第一次使用preg链接。试试这些没有成功:$ msgeBody = preg_replace('#()/.*/()#','$ 1 $ 2',$ msgeBody); $ msgeBody = preg_replace('#()/ [0-9] $/m()#','$ 1 $ 2',$ msgeBody); – Paul

+0

Re终点,伟大的工作!我留下了签名标签,里面什么也没有,但可以轻松删除。感谢您创建示例。您是否想将解决方案复制到单独的答案中,以便我可以正确输入? – Paul

回答

1

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

\ S:匹配除空格,制表符或换行的任何其他。
\ s:匹配任何空格,制表符或换行符。
*:匹配零个或多个连续字符。

+0

是的,这个工程。这是上面Terminus首先提出的建议,所以我在等待,看他是否在滴答之前输入这个解决方案。 – Paul

+0

@保罗我不会。前进。虽然请检查Casimir的答案。这是非常光滑的 – Terminus

+0

这是执行一个贪婪的匹配,它可能会失败,多个''标签,即使它不清楚问题是否可能有多个。 – Mariano

0

尝试使用TRIM()/ 功能是去除空格或指定/A卡拉科特:

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

+0

试过这个,没效果。把$ msgeBody = trim($ msgeBody); 但是,这只是删除我认为之前/之后的空白,而不是在签名标签内。 – Paul

+0

小时试图从字符串中删除空白而不是在边缘。看看他的例子。 – Terminus

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>');可能也砍了下来,但与马里亚诺的有关多个签名警告第一次出现。未经测试。

strip_tags($msgeBody, '');将在可能使用的情况下摆脱所有标签。 (您可以在''中添加任何要保留的标签 - 例如'<br />'。)

+0

在电子邮件正文具有文字签名的情况下,这会失败。 – Mariano

+0

@Mariano Ahh我明白你的意思 - 抱歉 - 有一个选项可以在/ body上爆炸吗?不确定爆炸会接受标签。为了避免在文本中出现这个词,你可以检查一下'<'是否存在,如果它不在那里,那么你会失去速度优势。尽管如此,这对我仍然适用于另一种情况。 – Steve

+0

我不知道。我会使用[DOM](http://stackoverflow.com/a/33838227/5290909) – Mariano

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();