2012-09-03 122 views
5

这是很难用言语来形容我的问题,我将提供一个示例尝试:如何删除除邮件格式容器标签标签

str = '<p>lorem ipsum <[email protected]> donor sit <br></p>'; 

我需要删除除<[email protected]>

所有标签我们如何在JavaScript和PHP中做到这一点?

我的PHP解决方案:

class test { 
    public function keepMailAddresses($text){ 
     $callBack = array($this,'_keepMailAddresses'); 
     return preg_replace_callback('/(<)([^0-9][a-zA-Z0-9_]*([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4})(>)/i', $callBack, $text);   
    } 

    private function _keepMailAddresses($matches){ 
     return '&lt;'.$matches[2].'&gt;'; 
    } 

} 

$obj = new test(); 
echo $obj->keepMailAddresses('<p>lorem ipsum <[email protected]> donor sit <br></p>'); 
+1

这是无效的标记。电子邮件地址周围的'<>'应该是'>'和'<',或者如果这是XHTML,则P文本应该是CDATA部分。它现在的电子邮件的方式是创建一个无效的元素。 – Gordon

+0

@Gordon我完全同意你的看法,我需要将< and >转换为>和<,只有当它是一个电子邮件地址时,其他情况下的标签应该被分条。 – WebolizeR

+0

@WebolizeR不,你应该已经插入尖括号作为实体已经... – feeela

回答

1

确定我的解决方案是有点怪异,但会做的伎俩:d以下

$pagecode = '<p>lorem ipsum <[email protected]> donor <[email protected]> sit <[email protected]><br></p>'; 

// this will check if it's a real email but you don't need it 
/*$allowed = preg_match_all("/\<+([_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)(\.[a-z0-9-]+)*(\.[a-z]{2,4})+\>/i", $pagecode, $matches);*/ 

$allowed = preg_match_all("/\<([_a-z0-9-\.]+)@([_a-z0-9-\.]+)\>/i", $pagecode, $matches); 

$allowed = implode(" ", $matches[0]); 
$output = strip_tags($pagecode, $allowed); 
echo htmlentities($output); 
1

使用页眉部分

$headers = 'MIME-Version: 1.0' . "\r\n"; 
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; 

和像这样放置

str = '<p>lorem ipsum "<[email protected]>" donor sit <br></p>';