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