0

我正在制作一个模因生成器,Imagick 生成图像。我的问题是,即使我对用于图像的字符串进行了一些操作,输出也不正确。

举例:

$_POST['text_top'] = " test test<br>"; //(starts with a space)

然后我做:

$text_top = strip_tags(trim($_POST['text_top']));

但是在 $text_top 的显示上,将变量粘贴到图像上后,我得到:

&nbsptest test&lt;br&gt;

如果我调用 strip_tags 和 trim,为什么会发生这种情况,从我看到的情况来看,是正确的并且像往常一样?

全部采用 UTF8 编码。

谢谢!

编辑:(完整代码)

function wordWrapAnnotation(&$image, &$draw, $text, $maxWidth)
{
$words = explode(" ", $text);
$lines = array();
$i = 0;
$lineHeight = 0;
while($i < count($words) )
{
    $currentLine = $words[$i];
    if($i+1 >= count($words))
    {
        $lines[] = $currentLine;
        break;
    }
    //Check to see if we can add another word to this line
    $metrics = $image->queryFontMetrics($draw, $currentLine . ' ' . $words[$i+1]);
    while($metrics['textWidth'] <= $maxWidth)
    {
        //If so, do it and keep doing it!
        $currentLine .= ' ' . $words[++$i];
        if($i+1 >= count($words))
            break;
        $metrics = $image->queryFontMetrics($draw, $currentLine . ' ' . $words[$i+1]);
    }
    //We can't add the next word to this line, so loop to the next line
    $lines[] = $currentLine;
    $i++;
    //Finally, update line height
    if($metrics['textHeight'] > $lineHeight)
        $lineHeight = $metrics['textHeight'];
}
return array($lines, $lineHeight);
}

$text_top = strip_tags(trim($_REQUEST['text_top']));
$text_bottom = strip_tags(trim($_REQUEST['text_bottom']));
$id_base = trim($_REQUEST['id_base']);

/* Création d'un nouvel objet imagick */
$im = new Imagick($_REQUEST['image']);

/* Création d'un nouvel objet imagickdraw */
$draw = new ImagickDraw();

/* Définition de la taille du texte à 52 */
$draw->setFontSize(52);
$draw->setTextAlignment(2);
$draw->setFont("impact.ttf");
$draw->setFillColor('white');
$draw->setStrokeColor("black");
$draw->setStrokeWidth(1);

/* Ajout d'un texte */
//$draw->annotation($im->getImageWidth()/2, 50, $text);
list($lines, $lineHeight) = wordWrapAnnotation($im, $draw, stripslashes($text_top), $im->getImageWidth());
$posY= 50;
for($i = 0; $i < count($lines); $i++){
$draw->annotation($im->getImageWidth()/2, $posY + $i*$lineHeight, $lines[$i]);
}

$im->drawImage($draw);
4

2 回答 2

5

你可以试试这个?

$text_top = strip_tags(trim(html_entity_decode($_POST['text_top'], ENT_QUOTES, 'UTF-8'), "\xc2\xa0"));

您的字符串似乎是 html 编码的。

编辑

添加了对 UTF-8 编码的支持。这样,不间断的空间会被正确修剪,而不是给出?.

来自 PHP 的html_entity_decode文档:

笔记:

你可能想知道为什么 trim(html_entity_decode(' ')); 不会将字符串缩减为空字符串,这是因为 ' ' 实体不是 ASCII 码 32(由 trim() 剥离)而是默认 ISO 8859-1 编码中的 ASCII 码 160 (0xa0)。

于 2012-10-11T20:11:11.967 回答
0

尝试使用这个小解决方案:

$str = trim($_POST['text_top']);
$clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $str);

如果拳头不能正常工作,试试这个:

$str = trim($_POST['text_top']);
$clean = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
$clean = preg_replace("/[^a-zA-Z0-9\/_| -]/", '', $clean);
$clean = strtolower(trim($clean, '-'));
$clean = preg_replace("/[\/_| -]+/", '-', $clean);
于 2012-10-11T20:25:50.257 回答