Сделать текстовую строку читаемой справа налево в функции 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);

?>

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

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

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

5 ответов

Вы можете изменить 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

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

<?php
$s = iconv("ISO-8859-8", "UTF-8", hebrev(iconv("UTF-8", "ISO-8859-8", $s)));
?>
<?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 לחמ

?>

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

Я бы порекомендовал использовать эту функцию 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

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

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

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

Другие вопросы по тегам