天道酬勤,学无止境

How to remove unwanted HTML tags from user input but keep text inside the tags in PHP using DOMDocument

问题

我在 S3 中存储了大约 200 万个包含各种 HTML 的 HTML 页面。 我试图仅从这些存储的页面中提取内容,但我希望保留具有某些约束的 HTML 结构。 这个 HTML 是所有用户提供的输入,应该被认为是不安全的。 因此,出于显示目的,我只想保留一些对属性和属性值有约束的 HTML 标记,但仍保留所有正确编码的文本内容,即使是不允许的标记。

例如,我想只允许特定的标签,如<p><h1><h2><h3><ul><ol><li>等。但我也想保留在不允许的标签之间找到任何文本并保持其结构。 我还希望能够限制每个标签中的属性或强制将某些属性应用于特定标签。

例如,在以下 HTML...

<div id="content">
  Some text...
  <p class="someclass">Hello <span style="color: purple;">PHP</span>!</p>
</div>

我希望结果是...

  Some text...
  <p>Hello PHP!</p>

因此去除了不需要的<div><span>标签,所有标签的不需要的属性,并且仍然保留<div><span>中的文本。

简单地使用strip_tags()在这里不起作用。 所以我尝试使用 DOMDocuemnt 执行以下操作。

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

foreach($dom->childNodes as $node) {
    if ($node->nodeName != "p") { // only allow paragraph tags
        $text = $node->nodeValue;
        $node->parentNode->nodeValue .= $text;
        $node->parentNode->removeChild($node);
    }
}

echo $dom->saveHTML();

这适用于没有嵌套标签的简单情况,但当 HTML 很复杂时显然会失败。

我不能准确地在每个节点的子节点上递归调用此函数,因为如果我删除该节点,我会丢失所有进一步的嵌套子节点。 即使我将节点删除推迟到递归之后,文本插入的顺序也会变得棘手。 因为我尝试深入并返回所有有效节点,然后开始将无效子节点的值连接在一起,结果真的很混乱。

例如,假设我想在以下 HTML 中允许<p><em>

<p>Hello <strong>there <em>PHP</em>!</strong></p>

但我不想允许<strong> 。 如果<strong>嵌套了<em>我的方法会变得非常混乱。 因为我会得到类似...

<p>Hello there !<em>PHP</em></p>

这显然是错误的。 我意识到获取整个nodeValue是一种不好的方法。 因此,我开始研究其他方法,一次遍历整个树一个节点。 只是发现很难推广这个解决方案,以便每次都能正常工作。

更新

使用strip_tags()的解决方案或此处提供的答案对我的用例没有帮助,因为前者不允许我控制属性,而后者会删除任何具有属性的标签。 我不想删除任何具有属性的标签。 我想明确允许某些标签,但仍然可以扩展控制可以在 HTML 中保留/修改哪些属性。

回答1

似乎这个问题需要分解成两个较小的步骤才能概括解决方案。

一、遍历 DOM 树

为了得到一个可行的解决方案,我发现我需要有一种明智的方法来遍历 DOM 树中的每个节点并检查它,以确定它是否应该保持原样或修改。

因此,我使用编写了以下方法作为从DOMDocument扩展的简单生成器。

class HTMLFixer extends DOMDocument {
    public function walk(DOMNode $node, $skipParent = false) {
        if (!$skipParent) {
            yield $node;
        }
        if ($node->hasChildNodes()) {
            foreach ($node->childNodes as $n) {
                yield from $this->walk($n);
            }
        }
    }
}

这种方式像foreach($dom->walk($dom) as $node)给了我一个简单的循环来遍历整个树。 当然,这是一个 PHP 7 唯一的解决方案,因为它是yield from ,但我对此表示满意。

第二,删除标签但保留其文本

棘手的部分是弄清楚如何在循环内进行修改时保留文本而不是标签。 因此,在尝试了几种不同的方法后,我发现最简单的方法是构建一个要从循环内部删除的标签列表,然后稍后使用 DOMNode::insertBefore() 将它们删除以将文本节点附加到树上。 这样以后删除这些节点没有副作用。

所以我为DOMDocument的这个子类添加了另一个通用stripTags方法。

public function stripTags(DOMNode $node) {
    $change = $remove = [];
    
    /* Walk the entire tree to build a list of things that need removed */
    foreach($this->walk($node) as $n) {
        if ($n instanceof DOMText || $n instanceof DOMDocument) {
            continue;
        }
        $this->stripAttributes($n); // strips all node attributes not allowed
        $this->forceAttributes($n); // forces any required attributes
        if (!in_array($n->nodeName, $this->allowedTags, true)) {
            // track the disallowed node for removal
            $remove[] = $n;
            // we take all of its child nodes for modification later
            foreach($n->childNodes as $child) {
                $change[] = [$child, $n];
            }
        }
    }
    
    /* Go through the list of changes first so we don't break the
       referential integrity of the tree */
    foreach($change as list($a, $b)) {
        $b->parentNode->insertBefore($a, $b);
    }

    /* Now we can safely remove the old nodes */
    foreach($remove as $a) {
        if ($a->parentNode) {
            $a->parentNode->removeChild($a);
        }
    }
}

这里的技巧是因为我们在不允许的标签的子节点(即文本节点)上使用insertBefore ,将它们向上移动到父标签,我们可以轻松破坏树(我们正在复制)。 起初这让我很困惑,但看看该方法的工作方式,这是有道理的。 推迟节点的移动可以确保当更深的节点是允许的节点时我们不会破坏parentNode引用,但它的父节点不在允许的标签列表中。

完整的解决方案

这是我想出的更普遍地解决这个问题的完整解决方案。 我将包括在我的答案中,因为我在其他地方使用 DOMDocument 进行此操作时很难找到很多边缘案例。 它允许您指定允许哪些标签,并删除所有其他标签。 它还允许您指定允许哪些属性以及可以删除所有其他属性(甚至强制某些标签上的某些属性)。

class HTMLFixer extends DOMDocument {
    protected static $defaultAllowedTags = [
        'p',
        'h1',
        'h2',
        'h3',
        'h4',
        'h5',
        'h6',
        'pre',
        'code',
        'blockquote',
        'q',
        'strong',
        'em',
        'del',
        'img',
        'a',
        'table',
        'thead',
        'tbody',
        'tfoot',
        'tr',
        'th',
        'td',
        'ul',
        'ol',
        'li',
    ];
    protected static $defaultAllowedAttributes = [
        'a'   => ['href'],
        'img' => ['src'],
        'pre' => ['class'],
    ];
    protected static $defaultForceAttributes = [
        'a' => ['target' => '_blank'],
    ];

    protected $allowedTags       = [];
    protected $allowedAttributes = [];
    protected $forceAttributes   = [];

    public function __construct($version = null, $encoding = null, $allowedTags = [],
                                $allowedAttributes = [], $forceAttributes = []) {
        $this->setAllowedTags($allowedTags ?: static::$defaultAllowedTags);
        $this->setAllowedAttributes($allowedAttributes ?: static::$defaultAllowedAttributes);
        $this->setForceAttributes($forceAttributes ?: static::$defaultForceAttributes);
        parent::__construct($version, $encoding);
    }

    public function setAllowedTags(Array $tags) {
        $this->allowedTags = $tags;
    }

    public function setAllowedAttributes(Array $attributes) {
        $this->allowedAttributes = $attributes;
    }

    public function setForceAttributes(Array $attributes) {
        $this->forceAttributes = $attributes;
    }

    public function getAllowedTags() {
        return $this->allowedTags;
    }

    public function getAllowedAttributes() {
        return $this->allowedAttributes;
    }

    public function getForceAttributes() {
        return $this->forceAttributes;
    }

    public function saveHTML(DOMNode $node = null) {
        if (!$node) {
            $node = $this;
        }
        $this->stripTags($node);
        return parent::saveHTML($node);
    }

    protected function stripTags(DOMNode $node) {
        $change = $remove = [];
        foreach($this->walk($node) as $n) {
            if ($n instanceof DOMText || $n instanceof DOMDocument) {
                continue;
            }
            $this->stripAttributes($n);
            $this->forceAttributes($n);
            if (!in_array($n->nodeName, $this->allowedTags, true)) {
                $remove[] = $n;
                foreach($n->childNodes as $child) {
                    $change[] = [$child, $n];
                }
            }
        }
        foreach($change as list($a, $b)) {
            $b->parentNode->insertBefore($a, $b);
        }
        foreach($remove as $a) {
            if ($a->parentNode) {
                $a->parentNode->removeChild($a);
            }
        }
    }

    protected function stripAttributes(DOMNode $node) {
        $attributes = $node->attributes;
        $len = $attributes->length;
        for ($i = $len - 1; $i >= 0; $i--) {
            $attr = $attributes->item($i);
            if (!isset($this->allowedAttributes[$node->nodeName]) ||
                !in_array($attr->name, $this->allowedAttributes[$node->nodeName], true)) {
                $node->removeAttributeNode($attr);
            }
        }
    }

    protected function forceAttributes(DOMNode $node) {
        if (isset($this->forceAttributes[$node->nodeName])) {
            foreach ($this->forceAttributes[$node->nodeName] as $attribute => $value) {
                $node->setAttribute($attribute, $value);
            }
        }
    }

    protected function walk(DOMNode $node, $skipParent = false) {
        if (!$skipParent) {
            yield $node;
        }
        if ($node->hasChildNodes()) {
            foreach ($node->childNodes as $n) {
                yield from $this->walk($n);
            }
        }
    }
}

因此,如果我们有以下 HTML

<div id="content">
  Some text...
  <p class="someclass">Hello <span style="color: purple;">P<em>H</em>P</span>!</p>
</div>

我们只想允许<p><em>

$html = <<<'HTML'
    <div id="content">
      Some text...
      <p class="someclass">Hello <span style="color: purple;">P<em>H</em>P</span>!</p>
    </div>
HTML;

$dom = new HTMLFixer(null, null, ['p', 'em']);
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

echo $dom->saveHTML($dom);

我们会得到这样的东西...

      Some text...
      <p>Hello P<em>H</em>P!</p>

由于您可以将其限制为 DOM 中的特定子树,因此该解决方案可以更通用。

回答2

您可以像这样使用 strip_tags() :

$html = '<div id="content">
  Some text...
  <p class="someclass">Hello <span style="color: purple;">PHP</span>!</p>
</div>';
$updatedHTML = strip_tags($text,"<p><h1><h2><h3><ul><ol><li>"); 
   //in second parameter we need to provide which html tag we need to retain.

您可以在这里获得更多信息:http://php.net/manual/en/function.strip-tags.php

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • How to remove unwanted HTML tags from user input but keep text inside the tags in PHP using DOMDocument
    I have around ~2 Million stored HTML pages in S3 that contain various HTML. I'm trying to extract only the content from those stored pages, but I wish to retain the HTML structure with certain constraints. This HTML is all user-supplied input and should be considered unsafe. So for display purposes, I want to retain only some of the HTML tags with a constraint on attributes and attribute values, but still retain all of the properly encoded text content inside even disallowed tags. For example, I'd like to allow only specific tags like <p>, <h1>, <h2>, <h3>, <ul>, <ol>, <li>, etc.. But I also
  • 在Beautifulsoup Python上排除不需要的标签(Exclude unwanted tag on Beautifulsoup Python)
    问题 <span> I Like <span class='unwanted'> to punch </span> your face </span> 如何打印“我喜欢你的脸”而不是“我喜欢打你的脸” 我试过了 lala = soup.find_all('span') for p in lala: if not p.find(class_='unwanted'): print p.text 但它给出“ TypeError:find()不包含关键字参数” 回答1 您可以在获取文本之前使用extract()删除不需要的标签。 但是它保留了所有的'\n'和spaces因此您将需要一些工作来删除它们。 data = '''<span> I Like <span class='unwanted'> to punch </span> your face <span>''' from bs4 import BeautifulSoup as BS soup = BS(data, 'html.parser') external_span = soup.find('span') print("1 HTML:", external_span) print("1 TEXT:", external_span.text.strip()) unwanted = external_span.find('span'
  • 如何从HAML的pre标签中删除不需要的缩进(How to remove unwanted indent from HAML's pre tag)
    问题 我在<pre>遇到问题,这是我的代码,下面的屏幕快照已附上。 如何删除缩进? %pre.code :escaped <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head></head> <body> <form> <input type="text" name="empID" /> <input type="submit"/> </form> </body> </html> 回答1 您需要使用#preserve帮助程序将pre中的换行符转换为换行符实体,如下所示: %pre.code = preserve do :escaped <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head></head> <body> <form> <input type="text" name="empID" /> <input type="submit"/> </form
  • 如何在PHP中删除文本的html部分(How to remove html part of a text in PHP)
    问题 我有一个关于解析文本和删除不需要的 html 部分的问题。 我知道像 - strip_tags() 这样的函数会删除所有标签,但问题是,这个函数在那里留下了“内部文本”。 让我给你看一个例子,我们有一段文字: Hello, how are you? <a href="">Link to my website</a> __Here continues html tags, links, images__ 我想要的是删除 html 所在的整个部分。 不仅是标签,还有文本(如上面的“链接到我的网站”)。 有没有什么有效的方法,我错过的功能? 回答1 尝试这个: function removeTags($str) { $result = ''; $xpath = new DOMXPath(DOMDocument::loadHTML(sprintf('<body>%s</body>', $str))); foreach ($xpath->query('//body/text()') as $textNode) { $result .= $textNode->nodeValue; } return $result; } echo removeTags( 'Hello, how are you? <a href="">Link to my website</a> __Here
  • 如何在 javascript 中去除所有 html 标签,但有例外?(How do I strip all html tags in javascript with exceptions?)
    问题
  • 如何删除不需要的来自使用 TinyMCE 的 WordPress 编辑器的标签?(How to remove unwanted <p> tags from WordPress editor using TinyMCE?)
    问题 我正在使用 WordPress 编辑器 TinyMCE。 我有这样的事情: <div class="TA_excellent" id="TA_excellent150"><ul>...</ul></div> <script type="text/javascript" src="http://www.jscache.com/wejs?wtype=excellent&uniq=150&locationId=287500&lang=en_AU"> </script> 当我跳到可视化编辑器时,“脚本”标签从内容中删除。 所以我尝试了各种插件,包括 Ultimate TinyMCE,但这次“script”标签被“p”标签包裹。 所以输出是这样的: ...</ul></div> <p> <script type="text/javascript" src="http://www.jscache.com/wejs?wtype=excellent&uniq=150&locationId=287500&lang=en_AU"> </script> <script src="http://www.tripadvisor.com.au/WidgetEmbed-excellent?uniq=150&locationId=287500&lang=en_AU"></script </p>
  • HTML敏捷包-删除不需要的标签而不删除内容?(HTML agility pack - removing unwanted tags without removing content?)
    问题 我在这里看到了一些相关的问题,但是他们并没有完全谈论我面临的相同问题。 我想使用HTML Agility Pack从我的HTML中删除不需要的标签,而又不会丢失标签内的内容。 因此,例如,在我的场景中,我想保留标签“ b ”,“ i ”和“ u ”。 对于像这样的输入: <p>my paragraph <div>and my <b>div</b></div> are <i>italic</i> and <b>bold</b></p> 生成的HTML应该是: my paragraph and my <b>div</b> are <i>italic</i> and <b>bold</b> 我尝试使用HtmlNode的Remove方法,但是它也删除了我的内容。 有什么建议? 回答1 我根据Oded的建议编写了一种算法。 这里是。 奇迹般有效。 它将删除所有标签,除了strong , em , u和raw文本节点。 internal static string RemoveUnwantedTags(string data) { if(string.IsNullOrEmpty(data)) return string.Empty; var document = new HtmlDocument(); document.LoadHtml(data); var acceptableTags
  • python中用什么去掉不要的代码_python去除所有html标签的方法 python去掉html标签
    python去掉html标签 如下代码: 开始1~3<?xms = '开始1~3'import red = re.sub(']+>','',s)print d开始1~3城市里似乎太多已知,小编老家的一个小水池都有好多未知。 python 如何过滤 HTML标签侵泡过眼泪的微笑最美丽,体味过挫折的成功最可贵。 基于文本文档(Markdown) 设想好需要的基本需要的表、字段、类型; 使用 Rails Migration 随着功能的开发逐步创建表; 随着细节功能的开发、需分享,逐步增加字段,删除字段,或者调整字段类型; 第一个 Release 的时候清理 Migrations 合并成一个;走不进的世界就不要硬挤,既为难了别人又作践了自己! 如何用Python爬取出HTML指定标签内的文本? 小编想只要其中下标签所包含的文本信息,或者有什么办法只留下页这种情况用xpath啊,什么re和bs4都弱爆了。 import requestsfrom lxml import etreedef getHTMLtext(url): res=requests.get(url,timeout=30) # 处理中文编码问题 res.encoding='gb2312' # 转化html html=etree.HTML(res.text) # xpath提取tr标幸福是一种感觉,而不是拥有多少,不要说谁比谁幸福
  • 如何在带有美汤的div中选择一类div?(How to select a class of div inside of a div with beautiful soup?)
    问题 我在 div 标签中有一堆 div 标签: <div class="foo"> <div class="bar">I want this</div> <div class="unwanted">Not this</div> </div> <div class="bar">Don't want this either </div> 所以我使用蟒蛇和美丽的汤来分离东西。 仅当它包含在“foo”类 div 中时,我才需要所有“bar”类。 这是我的代码 from bs4 import BeautifulSoup soup = BeautifulSoup(open(r'C:\test.htm')) tag = soup.div for each_div in soup.findAll('div',{'class':'foo'}): print(tag["bar"]).encode("utf-8") 或者,我尝试过: from bs4 import BeautifulSoup soup = BeautifulSoup(open(r'C:\test.htm')) for each_div in soup.findAll('div',{'class':'foo'}): print(each_div.findAll('div',{'class':'bar'})).encode("utf-8"
  • How to remove unwanted indent from HAML's pre tag
    I have problem with <pre>, here is my code, and the screenshot is attached below. How to remove the indents? %pre.code :escaped <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head></head> <body> <form> <input type="text" name="empID" /> <input type="submit"/> </form> </body> </html>
  • 如何保持使用 XPATH?(How to keep <p><img … /></p> with XPATH?)
    问题 我使用 XPATH 删除不整洁的 HTML 标签, $nodeList = $xpath->query("//*[normalize-space(.)='' and not(self::br)]"); foreach($nodeList as $node) { $node->parentNode->removeChild($node); } 将删除这些可怕的输入, <p><em><br /></em></p> <p><span style="text-decoration: underline;"><em><br /></em></span></p> 但它也删除了我想保留的img tag例如 <p><img title="picture summit" src="images/32913430_127001_e.jpg" alt="picture summit" width="590" height="366" /></p> 如何使用 XPATH 保留img tag输入? 回答1 使用: //p[not(descendant::*[self::img or self::br]) and normalize-space()=''] 回答2 也许您可以使用如下所示的 XPath 1.0 表达式来删除不需要的段落: //p[count(text())=0 and count(img
  • 将富文本粘贴到内容可编辑的div中,并且仅保留粗体和斜体格式(Paste rich text into content-editable div and only keep bold and italics formatting)
    问题 我想将具有不同字体,字体大小,字体粗细等的富文本粘贴到内容可编辑的div并且仅保留粗体和斜体。 任何想法如何去做? 当粘贴到内容可编辑的div中时,以下代码将富文本格式转换为纯文本格式。 $('[contenteditable]').on('paste',function(e) { e.preventDefault(); var text = (e.originalEvent || e).clipboardData.getData('text/plain') || prompt('Paste something..'); document.execCommand('insertText', false, text); }); 我试过看上面代码中的text变量,但是它似乎没有格式化。 回答1 这是一个工作示例:http://jsfiddle.net/SJR3H/7/ $(document).ready(function(){ $('[contenteditable]').on('paste',function(e) { e.preventDefault(); var text = (e.originalEvent || e).clipboardData.getData('text/html') || prompt('Paste something..'); var
  • Beautiful Soup Error: '<class 'bs4.element.Tag'>' object has no attribute 'contents'?
    I'm writing a script that extracts the content out of an article and removes any unnecessary stuff eg. scripts and styling. Beautiful Soup keeps raising the following exception: '<class 'bs4.element.Tag'>' object has no attribute 'contents' Here's the code of the trim function (element is the HTML element that contains the content of the webpage): def trim(element): elements_to_remove = ('script', 'style', 'link', 'form', 'object', 'iframe') for i in elements_to_remove: remove_all_elements(element, i) attributes_to_remove = ('class', 'id', 'style') for i in attributes_to_remove: remove_all
  • How to remove unwanted <p> tags from WordPress editor using TinyMCE?
    I am using WordPress editor TinyMCE. I have something like this: <div class="TA_excellent" id="TA_excellent150"><ul>...</ul></div> <script type="text/javascript" src="http://www.jscache.com/wejs?wtype=excellent&uniq=150&locationId=287500&lang=en_AU"> </script> When I skipped to visual editor "script" tags are removed from the content. So I tried every kind plugin including Ultimate TinyMCE but this time "script" tags are wrapped by "p" tags. So output is something like this: ...</ul></div> <p> <script type="text/javascript" src="http://www.jscache.com/wejs?wtype=excellent&uniq=150&locationId
  • 如何使用HTML / PHP防止XSS?(How to prevent XSS with HTML/PHP?)
    问题 如何仅使用HTML和PHP来防止XSS(跨站点脚本)? 我已经看过许多其他有关该主题的文章,但是我还没有找到一篇文章清楚,简洁地说明如何实际防止XSS。 回答1 基本上,每当您想将来自用户输入的内容输出到浏览器时,都需要使用htmlspecialchars()函数。 使用此功能的正确方法如下所示: echo htmlspecialchars($string, ENT_QUOTES, 'UTF-8'); Google Code University在网络安全方面也提供了以下非常有教育意义的视频: 如何破坏Web软件-看看Web软件中的安全漏洞每个工程师都需要了解有关安全性的知识以及从何处学习 回答2 最重要的步骤之一是在处理和/或呈现回浏览器之前清除所有用户输入。 PHP具有一些可以使用的“过滤器”功能。 XSS攻击通常具有的形式是插入指向包含用户恶意意图的非现场javascript的链接。 在这里阅读更多有关它的信息。 您还需要测试您的网站-我可以推荐Firefox附加组件XSS Me。 回答3 按优先顺序: 如果您使用的是模板引擎(例如Twig,Smarty,Blade),请检查其是否提供上下文相关的转义。 我从经验中知道Twig会这么做。 {{ var|e('html_attr') }} 如果要允许HTML,请使用HTML Purifier。
  • 美汤错误:' ' 对象没有属性 'contents'?(Beautiful Soup Error: '<class 'bs4.element.Tag'>' object has no attribute 'contents'?)
    问题 我正在编写一个脚本,从文章中提取内容并删除任何不必要的内容,例如。 脚本和样式。 Beautiful Soup 不断引发以下异常: '<class 'bs4.element.Tag'>' object has no attribute 'contents' 下面是trim函数的代码(element是包含网页内容的HTML元素): def trim(element): elements_to_remove = ('script', 'style', 'link', 'form', 'object', 'iframe') for i in elements_to_remove: remove_all_elements(element, i) attributes_to_remove = ('class', 'id', 'style') for i in attributes_to_remove: remove_all_attributes(element, i) remove_all_comments(element) # Remove divs that have more non-p elements than p elements for div in element.find_all('div'): p = len(div.find_all('p')) img = len
  • 如何在突出显示 jekyll 中删除不必要的缩进和换行(How to remove unnecessary indent and break line in highlight jekyll)
    问题 我将 jekyll code highlight与gem rouge 。 模板 - Jekyll • 简单、支持博客的静态站点 代码 (index.html) --- layout: default --- <div class="container-fluid"> <div class="row"> <div class="col-sm-2" style="background-color:red;"> {% highlight ruby %} def hoge puts 'red' end {% endhighlight %} </div> <div class="col-sm-8" style="background-color:blue;"> {% highlight ruby %} def foo puts 'blue' end {% endhighlight %} </div> <div class="col-sm-2" style="background-color:yellow;"> {% highlight ruby %} def bar puts 'yellow' end {% endhighlight %} </div> </div> </div> 结果 犯罪 https://github.com/shingo-nakanishi/jekyll-dojo
  • PHP 如何在没有 HTML 标签的情况下回显(PHP How to echo without HTML tags)
    问题 我有一种系统,每个人都可以输入他想要的任何内容。 不过,他们似乎也可以使用诸如<img SRC="..."/> 、 <a href="..."></a>等标签。 你怎么能完全防止这种情况? 例如,如果有人输入<h1>Hello</h1>文本不会变大,但它只会显示<h1>Hello</h1> 。 如果无法做到这一点,请给我一个替代方案。 回答1 要使 HTML 显示为书面形式,您需要使用 htmlspecialchars() “转义”特殊字符 &、< 和 >。 或者,您可以删除所有标签并使用 strip_tags() 显示剩余的文本 回答2 你可以试试: echo htmlspecialchars('<a href="http://www.google.com">Google</a>'); 更多信息在这里 回答3 只需在要打印的字符串上使用 htmlentities 回答4 特殊字符或标签作为不同元素进行处理。 在将文本插入数据库之前,您可以使用htmlspecialcharacters($string_to_be_inserted)来转义 html 标签。 所有的 html 标签都将被删除,只有文本会被插入到数据库中。 希望这可以帮助 回答5 您还可以使用 HTMLPurifier 从您的用户输入中去除不需要的 HTML 标签 回答6 使用 htmlspecialchars
  • HTML agility pack - removing unwanted tags without removing content?
    I've seen a few related questions out here, but they don’t exactly talk about the same problem I am facing. I want to use the HTML Agility Pack to remove unwanted tags from my HTML without losing the content within the tags. So for instance, in my scenario, I would like to preserve the tags "b", "i" and "u". And for an input like: <p>my paragraph <div>and my <b>div</b></div> are <i>italic</i> and <b>bold</b></p> The resulting HTML should be: my paragraph and my <b>div</b> are <i>italic</i> and <b>bold</b> I tried using HtmlNode's Remove method, but it removes my content too. Any suggestions?
  • PHP:如何使用 nl2br() 和 HTML Purifier 保持换行?(PHP: How to keep line-breaks using nl2br() with HTML Purifier?)
    问题 问题:当使用 HTML Purifier 处理用户输入的内容时,换行符不会被转换为<br />标签。 考虑以下用户输入的内容: Lorem ipsum dolor sit amet. This is another line. <pre> .my-css-class { color: blue; } </pre> Lorem ipsum: <ul> <li>Lorem</li> <li>Ipsum</li> <li>Dolor</li> </ul> Dolor sit amet, MyName 使用 HTML Purifier 处理时,上述内容将更改为以下内容: Lorem ipsum 胡萝卜。 这是另一条线。 .my-css-class { color: blue; } 逻辑推理: 知识点非常疼痛胡萝卜,我的名字 如您所见,“ MyName ”原本打算由用户在单独的行上显示,现在与前一行一起显示。 怎么修? 当然,使用 PHP nl2br() 函数。 但是,无论是在净化内容之前还是之后使用它,都会出现新的问题。 这是在 HTML Purifier 之前使用 nl2br() 的示例: Lorem ipsum 胡萝卜。 这是另一条线。 .my-css-class { color: blue; } 逻辑推理: 知识点非常疼痛萝卜, 我的名字 发生的事情是 nl2br()