Getting PHP code to recognize special characters

2019-09-15 09:55发布

I have this text simulator that allows the visitor to choose their specific desired font and the number of lines they desire. This functionality would be similar to previewing on ThingsRemembered.com so you can see what the item looks like before you purchase it. It works well, however certain special characters do not work in the simulator. These are as follows:

# - Does not appear
& - truncates this and anything after it
+ - Does not appear
\ - Does not appear
' - Erases entire line

I presume I need to escape these characters and replace with their HTML friendly equivalents; does anyone have an example of how this is done?

<?php
//creates a image handle
$image = imagecreate( 700, 70 );

if(!empty($_GET["bgcolor"])){
$background = imagecolorallocate( $image,0, 0, 0);
}

else {
$background = imagecolorallocate( $image,255, 255, 255);
}

//GET COLORS FROM POST AND SPLIT INTO RGB FORMAT
$color  =  $_GET["color"];
$pieces = explode("-", $color);
 //COLORS
$color = imagecolorallocate($image, hexdec("0x".$pieces[0].""), hexdec("0x".$pieces[1].""),  hexdec("0x".$pieces[2].""));


$font = 'fonts/'.$_GET["font"].'';
$fontSize = "25";
$fontRotation = "0";
$str = utf8_encode_mix($_GET["name"]);

// char code replacements

$tb = imagettfbbox(25, 0, $font, $str);

$x = ceil((700 - $tb[2]) / 2);

ImageTTFText($image, $fontSize, $fontRotation, $x, 50, $color, $font, $str);

header("Content-Type: image/PNG");
ImagePng ($image);
imagedestroy($image);

    function utf8_encode_mix($input, $encode_keys=false)
    {
        if(is_array($input))
        {
            $result = array();
            foreach($input as $k => $v)
            {                
                $key = ($encode_keys)? utf8_encode($k) : $k;
                $result[$key] = utf8_encode_mix( $v, $encode_keys);
            }
        }
        else
        {
            $result = utf8_encode($input);
        }

        return $result;
    }
?>

The user's input is parsed by passing the text from the calling PHP page into this PHP code. The input string is passed to this routine as a query string variable; this was not my design, rather something I inherited.

3条回答
Emotional °昔
2楼-- · 2019-09-15 10:10

Special thanks to user @dorad for helping me get this working correctly. This is the code that actually works. I suspect the original version I had was coded for an earlier version of PHP which will not work correctly for special characters in newer PHP versions. So without further ado, this is the final code that works:

<?php
//creates a image handle
$image = imagecreate( 700, 70 );

if(!empty($_POST["bgcolor"])){
$background = imagecolorallocate( $image,0, 0, 0);
}

else {
$background = imagecolorallocate( $image,255, 255, 255);
}

//GET COLORS FROM POST AND SPLIT INTO RGB FORMAT
$color  =  $_POST["color"];
$pieces = explode("-", $color);
 //COLORS
$color = imagecolorallocate($image, hexdec("0x".$pieces[0].""), hexdec("0x".$pieces[1].""),  hexdec("0x".$pieces[2].""));


$font = 'fonts/'.$_POST["font"].'';
$fontSize = "25";
$fontRotation = "0";
$str = utf8_encode_mix($_POST["name"]);

$regex = $str;
$replaced = preg_replace($regex,"%26",$str);


$tb = imagettfbbox(25, 0, $font, $str);
$x = ceil((700 - $tb[2]) / 2);

ImageTTFText($image, $fontSize, $fontRotation, $x, 50, $color, $font, $str);

header("Content-Type: image/PNG");
ImagePng ($image);
imagedestroy($image);

    function utf8_encode_mix($input, $encode_keys=false)
    {
        if(is_array($input))
        {
            $result = array();
            foreach($input as $k => $v)
            {                
                $key = ($encode_keys)? utf8_encode($k) : $k;
                $result[$key] = utf8_encode_mix( $v, $encode_keys);
            }
        }
        else
        {
            $result = utf8_encode($input);
        }

        return $result;
    }
?>

Calling page index2.php

<div style="padding:00px;">

<strong>Please complete this form to preview the font and color font your name Embroidery: </strong>
<br><br>


<form action="index2.php?page=embroidery" method="post" name="font" style="background-color:#EDFAFC;">

<input name="page" type="hidden" value="lab_coats_embroidery">
<?
function checkcolor ($color) {

if($color == $_POST["color"]){
    echo "checked";
}
}

//
?>


<table width="600" border="0" cellspacing="4" cellpadding="4">
  <tr>
    <td width="163">Please enter your name: </td>
    <td width="398">Line 1:
      <input name="name" type="text" value="<?=$_POST["name"]?>" size="40">
      <br />
      Line 2:
      <input name="name2" type="text" value="<?=$_POST["name2"]?>" size="40" />
<br />
      Line 3:
      <input name="name3" type="text" value="<?=$_POST["name3"]?>" size="40" /></td>
    <td width="18">&nbsp;</td>
    <td width="21">&nbsp;</td>
  </tr>
  <tr>
    <td>Please select a font: </td>
    <td><select name="font" id="font">
     <option value="<?=$_POST["font"]?>"></option>
      <option value="brush">Brush script size 14</option>
      <option value="athletic">Athletic swoosh</option>
      <!--<option value="diana">Diana script</option>-->
      <option value="brush738">Brush 738</option>
      <option value="helvetica">Helvetica narrow</option>
      <option value="homeward">Homeward</option>
      <option value="cheltenham">Cheltenham</option>
      <option value="athletic_narrow">Athletic Narrow</option>
      <option value="courier">Courier</option>
<?php /*?>      <option value="cancun">Cancun</option><?php */?>
    </select>
      Color:
      <select name="color" id="color">
        <option value="<?=$_POST["color"]?>"></option>
        <option value="00-00-00">Black</option>
        <option value="cc-00-00">Red</option>
        <option value="05-34-92">Royal Blue</option>
        <option value="13-2c-61">Navy</option>
        <option value="86-00-41">Burgundy</option>
        <option value="fd-08-c8">Fuchsia</option>
        <option value="73-b9-ff">Sky Blue</option>
        <option value="02-74-8c">Teal</option>
        <option value="02-4b-2d">Forest Green</option>
        <option value="43-07-71">Purple</option>
        <option value="ff-c6-00">Gold</option>
        <option value="dd-dd-dd">Silver</option>
        <option value="96-54-31">Bronze</option>
      </select></td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td><input type="submit" name="button" id="button" value="Preview My Name" /></td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
</table>
</form>

<div style="text-align:center;">
<!-- orig setting height 65px and no background positioning -->
<div style="background-image:url('dpimage.php?name=<?=$_POST["name"]?>&font=<?=$_POST["font"]?>&color=<?=$_POST["color"]?>'); background-repeat:no; background-position: center -20px; width:700px; height:40px;"></div>
<div style="background-image:url('dpimage.php?name=<?=$_POST["name2"]?>&font=<?=$_POST["font"]?>&color=<?=$_POST["color"]?>'); background-repeat:no; background-position: center -20px; width:700px; height:40px;"></div>
<div style="background-image:url('dpimage.php?name=<?=$_POST["name3"]?>&font=<?=$_POST["font"]?>&color=<?=$_POST["color"]?> '); background-repeat:no; background-position: center -20px; width:700px; height:40px;"></div>

</div>

</div>
查看更多
ら.Afraid
3楼-- · 2019-09-15 10:18

You can use the following PHP to convert:

$html = '&#'.ord('#').';';

The ord function converts a character into an ASCII code (numeric). You can find a list of the characters and their numeric values in ASCII here: http://www.asciitable.com/

A function to convert all your special chars:

function convertSpecialToHTML($char) {
    $special = ['#', '&', '+', '\\'];

    if (in_array($char, $special)) {
        return '&#'.ord($char).';';
    } else {
        return $char;
    }
}

demo: http://ideone.com/vGNZ5e

You should also have a look on htmlentities:

echo htmlentities("I'm a string with all your special characters: \ + & #", ENT_HTML5);
//I'm a string with all your special characters&colon; &bsol; &plus; &amp; &num;
查看更多
迷人小祖宗
4楼-- · 2019-09-15 10:22

Use

&#35; where you want a #

&#38; where you want a &

&#43; where you want a +

&#92; where you want a \

查看更多
登录 后发表回答