Сделать текстовую строку, читаемую справа налево, в функции imagettftext()

Я знаю, что этот вопрос может показаться вам странным, но я очень беспокоюсь об этом, поэтому я пришел к вам.

Я хочу написать текстовую строку справа налево, а не слева направо с помощью 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);

?>

i также использовала эту функцию 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

Можете ли вы дать мне лучшее решение, что только ивритские символы становятся обратными не целыми числами.

Спасибо в Advance, потому что я знаю, что некоторые разработчики собираются помочь мне.

Ответы

Ответ 1

Вы можете изменить utf8_strrev() следующим образом:

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

Таким образом вы сопоставляете все, что не является цифрой, или все, что представляет собой последовательность цифр.

Итак, строка "один 123 два" приведет к строке "owt 123 eno".

Массив $ar внутри utf8_strrev() будет таким, как после preg_match_all():

[0] => o
[1] => n
[2] => e
[3] => 
[4] => 123
[5] =>
[6] => t
[7] => w
[8] => o

Ответ 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

Я бы рекомендовал использовать эту функцию 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). Обратите внимание, что текст, fontfile, fontsize и angle должны быть одинаковыми как для imageTTFBbox, так и для imagettftext, чтобы он работал

Если вам также придется отменить текст, я бы рекомендовал решение @Master_ex

(Код еще не протестирован. Прокомментируйте, если это не работает, поэтому я могу проверить его и, конечно же, исправить код)

Ответ 4

Это поможет вам:

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

Ответ 5

Самый простой способ, возможно, не делать этого на стороне PHP вообще. Я предлагаю вам проверить http://www.codekhan.com/2012/01/how-to-use-bdo-tag-in-html5.html и посмотреть, не покрывает ли он ваши потребности.

В HTML-части вещей вы должны включить свой текст на иврите внутри блока rtl (как показано в ссылке), не преобразовывая фактические данные LTR или другой текст на вашу страницу.