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