16

我想用 imagettftext() 从右到左而不是从左到右写一个文本字符串;功能

我在手册中读到角度变量控制这个,它说 0 角度意味着从左到右,所以我尝试了 180、360 但没有任何反应

我需要把它放在什么角度才能让它从右到左写

我正在编写一个带有支持希伯来字符的 font.ttf 的希伯来文本字符串

<?php   
$white = imagecolorallocate($background, 255, 255, 255);
$fontfile = "davidtr.ttf";
$string = "מחלדגכ";
imagettftext($background, 12, 360, 3, 17, $white, $fontfile, $string);

?>

我也使用了这个函数 strrev(),

$white = imagecolorallocate($background, 255, 255, 255);
$fontfile = "davidtr.ttf";
$string = strrev("עברית");
//imagettftext($image, $font_size, 0, $x, $y, $text_color, $this->font , $code) or die('Error in imagettftext function');
imagettftext($background, 12, 0, 3, 17, $white, $fontfile, $string);

现在文字在图像上搞砸了一些字母是白框

然后我使用了这个功能:

function utf8_strrev($str){
   preg_match_all('/./us', $str, $ar);
   return join('',array_reverse($ar[0]));
}

它帮了我很多,但现在它也反转了整数

$string = "מחל 65 דגכ";
echo utf8_strrev($string);
//Now string revered but 65 converted to 56

您能否给我一个更好的解决方案,只有希伯来字符会反转,而不是整数?

4

4 回答 4

5

您可以像这样更改 utf8_strrev() :

function utf8_strrev($str){
   preg_match_all('/([^\d]|\d+)/us', $str, $ar);
   return join('',array_reverse($ar[0]));
}

这样,您可以匹配不是数字的所有内容或数字序列的所有内容。

因此,字符串“one 123 two”将产生字符串“owt 123 eno”。

utf8_strrev() 中的数组 $ar 在 preg_match_all() 之后是这样的:

[0] => o
[1] => n
[2] => e
[3] => 
[4] => 123
[5] =>
[6] => t
[7] => w
[8] => o
于 2015-08-13T19:56:50.633 回答
1

这将帮助您:

<?php
$s = iconv("ISO-8859-8", "UTF-8", hebrev(iconv("UTF-8", "ISO-8859-8", $s)));
?>
于 2016-07-13T10:19:04.077 回答
1
<?php

  function hebstrrev($string, $revInt = false, $encoding = 'UTF-8'){
    $mb_strrev = function($str) use ($encoding){return mb_convert_encoding(strrev(mb_convert_encoding($str, 'UTF-16BE', $encoding)), $encoding, 'UTF-16LE');};

    if(!$revInt){
      $s = '';
      foreach(array_reverse(preg_split('/(?<=\D)(?=\d)|\d+\K/', $string)) as $val){
        $s .= ctype_digit($val) ? $val : $mb_strrev($val);
      }
      return $s;
    } else {
      return $mb_strrev($string);
    }
  }

  echo hebstrrev("מחל 65 דגכ"); // outputs: כגד 65 לחמ
  echo hebstrrev("מחל 65 דגכ", true); // outputs: כגד 56 לחמ

?>

此函数使用可选参数反转字符串以反转字符串中的整数。它还允许更改字符串的编码,因此它应该是通用的,无论是什么语言。

于 2015-08-20T16:26:06.867 回答
0

我会推荐使用这个函数http://php.net/manual/de/function.imagettfbbox.php

<?php
$white = imagecolorallocate($background, 255, 255, 255);
$fontfile = "davidtr.ttf";
//text how it should be displayed
$string = "מחלדגכ"; //will result in:
                    //  -------------------
                    // |            מחלדגכ|
                    // |                  |
                    // |                  |
                    //  -------------------
$helper = imageTTFBbox(12,0,$fontfile,$string);
imagettftext($background, 12, 0, 15+imagesx($background)-abs($helper[4] - $helper[0]), 17, $white, $fontfile, $string);
?>

所以基本上你计算文本的宽度,得到图像的宽度,减去这些并添加一个填充(15)。请注意,imageTTFBbox 和 imagettftext 的文本、字体文件、字体大小和角度必须相同才能正常工作

如果您还必须反转文本,我会推荐Master_ex 的解决方案

代码尚未测试。

于 2015-08-19T21:15:09.883 回答