Проверьте язык строки на основе глифов в PHP
Вопрос
У меня есть база данных MySQL с названиями книг как на английском, так и на арабском языках, и я использую Класс PHP это позволяет автоматически транслитерировать арабский текст на латиницу.
Я бы хотел, чтобы мой выходной HTML-код выглядел примерно так:
<h3>A book</h3>
<h3>كتاب <em>(kitaab)</em></h3>
<h3>Another book</h3>
Есть ли способ для PHP определить язык строки на основе символов Юникода и глифов, используемых в ней?Я пытаюсь получить что-то вроде этого:
$Ar = new Arabic('EnTransliteration');
while ($item = mysql_fetch_array($results)) {
...
if (some test to see if $item['item_title'] has Arabic glyphs in it) {
echo "<h3>$item[item_title] <em>(" . $Ar->ar2en($item['item_title']) . ")</em></h3>";
} else {
echo "<h3>$item[item_title]</h3>";
}
...
}
К счастью, класс не захлебывается при вводе латинских символов, так что теоретически я мог бы отправить каждый результат через преобразование, но это кажется пустой тратой времени на обработку.
Спасибо!
Редактировать: Я до сих пор не нашел способа проверить наличие глифов или символов.Я полагаю, я мог бы поместить все арабские символы в массив и проверить, соответствует ли что-либо в массиве части строки...
Однако я нашел временное решение, которое в конце концов могло бы нормально сработать.Он подвергает преобразованию каждый заголовок независимо от языка, но выводит транслитерацию в скобках только в том случае, если строка была изменена:
while ($item = mysql_fetch_array($mysql_results)) {
$transliterate = trim(strtolower($Ar->ar2en($item['item_title'])));
$item_title = (strtolower($item['item_title']) == $transliterate) ? $item['item_title'] : $item['item_title'] . " <em>($transliterate)</em>";
echo "<h3>$item_title</h3>";
}
Решение
Это должно сработать:
preg_match("/\p{Arabic}/u", $item['item_title'])
Вы могли бы сделать это регулярное выражение немного более сложным, если хотите, но я не думаю, что вам это действительно нужно.
Тот Самый \p
экранирующая последовательность позволяет выбирать символы на основе их свойств в Юникоде (когда u
модификатор шаблона используется).
В руководстве по PHP упоминается:"Расширенные свойства, такие как "греческий" или "InMusicalSymbols", не поддерживаются PCRE". Но это уже не совсем так. В PCRE версии 6.5 добавлена поддержка имен скриптов.
Другие советы
Вот класс PHP с открытым исходным кодом для автоматического определения набора арабских символов: