当前位置: 首页 > 知识库问答 >
问题:

删除图像标记之间的所有空白

鲁宏爽
2023-03-14

我让用户提交一些文本(包括随机的html图像链接),然后我尝试从文本中的图像创建一个基本的BBCode[img][/img]标记。

我目前的测试方式如下:

字符串(取自随机论坛):

在进行了几年的常规降下、安装车轮等工作后,当涉及到汽车改装时,我们花了几年时间在英国南部的Minimoto锦标赛上进行了全国各地的Minimoto赛车,赢得了2006年的生产私掠者锦标赛。

然后,我使用以下函数替换任何图像属性/将图像标记更改为bbcode:

function convert($text) {
  $text = preg_replace('/class=".*?"/', '', $text);
  $text = preg_replace('/alt=".*?"/', '', $text);
  $text = preg_replace('/src="/', '', $text);
  $text = preg_replace('/border=".*?"/', '', $text);
  $text = preg_replace('/onload=".*?"/', '', $text);
  $text = str_replace("<img", "[img]", "$text");
  $text = str_replace('">', "[/img]", "$text");
  return nl2br($text);
}

如果标签没有用尾随斜杠关闭,这是非常好的。我可以再加一条规则:

  $text = str_replace('"/>', "[/img]", "$text");

这会起作用,但在我删除属性的地方仍然有空白。

因此,我的问题是,我是否可以删除img标签之间的空白:

  <img />

例如,在preg_replace函数中,.*?替换“”之间的内容。

我可以做一个类似的事情,但与img标签和删除他们之间的空白?

我显然不能跑了:

  $text = preg_replace('/\s+/', '', $text);

因为我需要文本中的空白等。

谢谢!


共有1个答案

沈长恨
2023-03-14

您应该删除任何空白和胭脂属性,以便几乎所有属性,尤其是onClick、onBlur等on*事件属性。将XSS攻击添加到HTML中的方法太多了。制作能够将它们全部删除的东西是不可维护的,所以如果您想让用户输入HTML,请使用htmlpurifier。它很容易初始化到您的代码中,并且有很多选项。

一个简单的替代方法是,只提取img的src,然后删除属性并将src放回并生成一个图像字符串,然后使用strip_tags()删除所有HTML,然后将图像连接到文本上。但它缺少图像的定位。

所以类似这样的东西:

<?php 
$html = <<<DEMO
After a fair <script>alert('XSS');</script>few ...
winning the 2006 Production Privateer Championship.<br /> 
<div style="background-image: url(javascript:alert('XSS'))"></div>
<br /> 
<img src="http://i2.photobucket.com/albums/y18/moo0484/scan0001.jpg" border="0" class="tcattdimglink" onload="NcodeImageResizer.createOn(this);" alt="" /><br /> 
<br /> 
text here
<img src="http://i2.photobucket.com/albums/y18/moo0484/01072007065.jpg" border="0" class="tcattdimglink" onload="NcodeImageResizer.createOn(this);" alt="" /><br />
more txt here
DEMO;

$dom = new DOMDocument;
@$dom->loadHTML($html);

$xpath = new DOMXPath($dom);

if (false === ($elements = $xpath->query("//*"))) die('Error');

foreach ($elements as $element) {

    //remove script tags
    if($element->nodeName=='script'){
        $element->parentNode->removeChild($element);
    }

    //remove empty tags but not images
    if (!$element->hasChildNodes() || $element->nodeValue == '') {
        if($element->nodeName != 'img'){
            $element->parentNode->removeChild($element);
        }
    }

    //remove all attributes except links and imgs
    for ($i = $element->attributes->length; --$i >= 0;) {
        $name = $element->attributes->item($i)->name;
        if (('img' === $element->nodeName && 'src' === $name) || ('a' === $element->nodeName && 'href' === $name)){
            continue;
        }
        $element->removeAttribute($name);
    }
}

//put dom together and remove the document body
echo preg_replace('~<(?:!DOCTYPE|/?(?:html|body))[^>]*>\s*~i', '', $dom->saveHTML());

/*
<p>After a fair few ...
winning the 2006 Production Privateer Championship.</p>
<img src="http://i2.photobucket.com/albums/y18/moo0484/scan0001.jpg"> 
text here
<img src="http://i2.photobucket.com/albums/y18/moo0484/01072007065.jpg">
more txt here
*/

虽然只是考虑使用htmlpurifier,但20世纪90年代的人也在打电话,他们想让BBCODE恢复使用markdown;P

祝你好运

 类似资料:
  • 问题内容: 鉴于: 结果是两张图像之间只有一个空格。似乎正常的行为是将任意数量的空格,换行符和制表符显示为单个空格。我知道我可以执行以下操作: 要么 要么 或任何其他数量的黑客。有没有办法用CSS删除空白?例如 问题答案: 使它们在您的CSS中。

  • 和以下内容: 获取以下错误:

  • 为什么要删除第一个空格和后面的所有内容?如果执行并打印后,最初是,则只打印而不打印。 这是一个更大项目的一部分,但出于测试目的,我在一个新的java主文件上单独尝试了它,并且仍然执行相同的操作这是完整的程序:

  • 我想删除一个本地图像标记(“存储库”/“标记”组合)。有可能吗? 我如何才能在仅与一个图像ID相关联的多个标记中删除任何一个标记而不删除其他标记?在我的情况下,我只想排除hiworld存储库。我可以删除图像,因此也可以删除与之相关联的所有标签,但这不是我想要做的。下面是输入命令docker images时显示的内容。 提前道谢。

  • 为什么两个 标记之间有空格?当我设置 标记的宽度时,它不起作用。我将其设置为 ,但两个 标记之间仍有空格。如何从 标记中删除空格? 以下是HTML和CSS代码: null null

  • 初来乍到,我正在创建一个网站,似乎有一个问题,我做了一个表,以保存一个图像和一个表,我做了一个内容。左边的内容右边的图像。当我向右浮动图像表时,内容表将完全移动到图像表下面。当我浮动它离开有太多的空间之间的2。所讨论的代码是表和表3。我希望它在链接按钮旁边显示图像块,在按钮下面但在图像块旁边显示上下文块。 第二个问题是我的logo标题,这是一个图像正在删除背景图像。 HTML代码 CSS代码 图像