【问题标题】:make text string read from right to left in imagettftext() function在 imagettftext() 函数中使文本字符串从右到左读取
【发布时间】:2014-05-31 23:40:31
【问题描述】:

我想用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

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

【问题讨论】:

  • 我从来都不擅长正则表达式;我更像是一个“遍历字符串”的人。但这个概念似乎是这样的:使用你的函数 utf8_strrev 来反转整个事情,然后在字符串中隔离每个连续的数字字符串并将 utf8_strrev 应用于它们(在字符串内)。我可以通过循环轻松地做到这一点,但我可能会得到一堆反对票。 ;)

标签: php imagettftext


【解决方案1】:

我会推荐使用这个功能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 的文本、字体文件、字体大小和角度必须相同才能正常工作

如果您还必须反转文本,我推荐solution by Master_ex

代码尚未测试。

【讨论】:

    【解决方案2】:
    <?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 לחמ
    
    ?>
    

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

    【讨论】:

      【解决方案3】:

      这对你有帮助:

      <?php
      $s = iconv("ISO-8859-8", "UTF-8", hebrev(iconv("UTF-8", "ISO-8859-8", $s)));
      ?>
      

      【讨论】:

      • 为什么“这会有帮助”?此答案缺少教育解释。
      • @mickmackusa 检查答案的日期和时间,答案于 2016 年 7 月 13 日给出。保持对解决方案的兴趣,而不是其他事情。谢谢
      • 无论帖子的年龄如何,我都会策划本网站上的所有内容。当我用旧页面敲出一个新问题时,旧的无法解释的答案会降低我努力的价值。您可以随时edit您的答案。
      【解决方案4】:

      你可以像这样改变 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
      

      【讨论】:

      • /([^\d]|\d+)/us 可以简化为/\D|\d+/u。捕获组不必要地增加了步数,[^\d]\D 相同,并且s 模式修饰符仅影响正则表达式模式中的.(非文字点)。此答案基于How to reverse a Unicode string
      猜你喜欢
      • 2014-06-26
      • 2022-01-13
      • 2019-09-12
      • 2018-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      相关资源
      最近更新 更多