Php 清理html标记内的内容

Php 清理html标记内的内容,php,regex,preg-replace,Php,Regex,Preg Replace,我正在尝试编写一个preg_replace,它将清除允许标记的所有标记属性,以及允许列表中不存在的所有标记 基本示例-这是: <p style="some styling here">Test<div class="button">Button Text</div></p> 测试按钮文本 结果是: <p>test</p> 测试 我觉得这个很好用。。除了img标签和a href标签。我不需要清理img和a标签的属性。

我正在尝试编写一个preg_replace,它将清除允许标记的所有标记属性,以及允许列表中不存在的所有标记

基本示例-这是:

<p style="some styling here">Test<div class="button">Button Text</div></p> 
测试按钮文本 结果是:

<p>test</p>
测试

我觉得这个很好用。。除了img标签和a href标签。我不需要清理img和a标签的属性。可能是其他人。我不确定是否有办法设置两个允许列表

1) 清洁后允许保留哪些标签的列表
2) 一个允许但不受影响的标签列表?
3) 其余的都被删除了

以下是我正在编写的脚本:

$string = '<p style="width: 250px;">This is some text<div class="button">This is the button</div><br><img src="waves.jpg" width="150" height="200" /></p><p><b>Title</b><br>Here is some more text and <a href="#" target="_blank">this is a link</a></p>';

$output = strip_tags($string, '<p><b><br><img><a>');
$output = preg_replace("/<([a-z][a-z0-9]*)[^>]*?(\/?)>/i", '<$1$2$3$4$5>', $output);

echo $output;
$string='

这是一些文本这是按钮
标题
这是一些更多文本和'; $output=strip_标签($string,

此函数将剥离一个元素中不允许的子元素,清理其“剥离”的子元素,并(递归地)保留其余的子元素

以下是清理字符串的代码:

function clean($element, $allowed, $stripped){
    if(!is_array($allowed) || ! is_array($stripped)) return;
    if(!$element)return;
    $toDelete = array();
    foreach($element->childNodes as $child){
        if(!isset($child->tagName))continue;
        $n = $child->tagName;
        if ($n && !in_array($n, $allowed) && !in_array($n, $stripped)){
            $toDelete[] = $child;
            continue;
        }
        if($n && in_array($n, $stripped)){
            $attr = array();
            foreach($child->attributes as $a)
                $attr[] = $a->nodeName;
            foreach($attr as $a)
                $child->removeAttribute($a);
        }
        clean($child, $allowed, $stripped);
    }
    foreach ($toDelete as $del)
        $element->removeChild($del);
}
$xhtml=”

这是一些文本这是按钮; $dom=新的DOMDocument(); $dom->loadHTML($xhtml); $body=$dom->getElementsByTagName('body')->item(0); 干净($body,array('img','a'),array('p','br','b')); echo preg_replace(“#^.*?(.*).$#s',“$1',$dom->saveHTML($body));

您应该查看有关的文档

此函数将剥离一个元素中不允许的子元素,清理其“剥离”的子元素,并(递归地)保留其余的子元素

以下是清理字符串的代码:

function clean($element, $allowed, $stripped){
    if(!is_array($allowed) || ! is_array($stripped)) return;
    if(!$element)return;
    $toDelete = array();
    foreach($element->childNodes as $child){
        if(!isset($child->tagName))continue;
        $n = $child->tagName;
        if ($n && !in_array($n, $allowed) && !in_array($n, $stripped)){
            $toDelete[] = $child;
            continue;
        }
        if($n && in_array($n, $stripped)){
            $attr = array();
            foreach($child->attributes as $a)
                $attr[] = $a->nodeName;
            foreach($attr as $a)
                $child->removeAttribute($a);
        }
        clean($child, $allowed, $stripped);
    }
    foreach ($toDelete as $del)
        $element->removeChild($del);
}
$xhtml=”

这是一些文本这是按钮; $dom=新的DOMDocument(); $dom->loadHTML($xhtml); $body=$dom->getElementsByTagName('body')->item(0); 干净($body,array('img','a'),array('p','br','b')); echo preg_replace(“#^.*?(.*).$#s',“$1',$dom->saveHTML($body));


您应该查看文档,了解

请不要使用正则表达式解析HTML。请改用正则表达式。关于哪个示例以及可能的一些简单代码示例,您有什么建议吗?我引用了您放置的链接,但是有太多的信息和太多的选项,我刚刚丢失了……这些解析器似乎是为了从中获取信息项目的标签。我不想这样做(除非我不理解)..我正在尝试清理开始标记中的属性。看起来您正在解析XHTML。为什么不只是简单的XML?请不要使用正则表达式解析HTML。请改用。关于哪一个以及可能的一些简单代码示例,有什么建议吗?我引用了您放置的链接,但我有太多的信息和太多的选项我只是迷路了…似乎那些解析器是为了在项目的标签之间获取信息。我不是在尝试这样做(除非我不理解)…我正在尝试清理开始标记中的属性。看起来您正在解析XHTML。为什么不只是简单的XML?当我看到这一点时,我很兴奋,但它在输出中放入了奇怪的字符。例如:这些字符(不确定是否会通过)可能是由于UTF-8编码。您能提供带有“奇怪”的输入和输出示例吗字符?数据是敏感的,有没有一种不通过此处公开发布的方式进行传输?我们可以通过电子邮件发送吗?John,如果您不能在此处发布,您不应该通过电子邮件发送给我。请查看您是否可以创建一个使用示例,非敏感数据来显示它如何损坏您的数据。检查字符串中是否有非ascii字符(比如“英镑”货币符号、带变音符号的字母),有时甚至是单引号和双引号字符——特别是当你从Microsoft产品中复制时。)我将使用虚拟文本创建一个示例,需要一些时间。谢谢!:)看到这一点我很兴奋,但它会在输出中添加奇怪的字符。比如:这些(不确定是否会通过)可能是由于UTF-8编码。你能提供带有“怪异”字符的输入和输出示例吗?数据是敏感的,有没有一种不通过此处公开发布的方式进行传输?我们可以通过电子邮件发送吗?约翰,如果你不能在这里发布,你不应该通过电子邮件发送给我。看看您是否可以创建一个使用非敏感数据示例的用例,以显示它是如何损坏您的数据的。检查您的字符串中是否有非ascii字符(例如“英镑”货币符号、带变音标记的字母),有时甚至还有单引号和双引号字符-尤其是从Microsoft产品中复制时)。我将使用伪文本创建一个示例,需要一些时间。谢谢!:)
$xhtml = '<p style="width: 250px;">This is some text<div class="button">This is the button</div><br><img src="waves.jpg" width="150" height="200" /></p><p><b>Title</b><br>Here is some more text and <a href="#" target="_blank">this is a link</a></p>';

$dom = new DOMDocument();
$dom->loadHTML($xhtml);
$body = $dom->getElementsByTagName('body')->item(0);
clean($body, array('img', 'a'), array('p', 'br', 'b'));
echo preg_replace('#^.*?<body>(.*?)</body>.*$#s', '$1', $dom->saveHTML($body));