在PHP中检查基于glyphs的字符串语言

在PHP中检查基于glyphs的字符串语言,php,mysql,unicode,arabic,Php,Mysql,Unicode,Arabic,我有一个MySQL数据库,书名有英文和阿拉伯文两种,我正在使用一个可以自动将阿拉伯文翻译成拉丁文的数据库 我希望我的输出HTML如下所示: <h3>A book</h3> <h3>كتاب <em>(kitaab)</em></h3> <h3>Another book</h3> $Ar = new Arabic('EnTransliteration'); while ($item = mysql_f

我有一个MySQL数据库,书名有英文和阿拉伯文两种,我正在使用一个可以自动将阿拉伯文翻译成拉丁文的数据库

我希望我的输出HTML如下所示:

<h3>A book</h3>
<h3>كتاب <em>(kitaab)</em></h3>
<h3>Another book</h3>
$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>";
    }
    ...
}
一本书
كتاب(北)
另一本书
PHP有没有一种方法可以根据字符串中使用的Unicode字符和字形来确定字符串的语言?我想得到这样的东西:

<h3>A book</h3>
<h3>كتاب <em>(kitaab)</em></h3>
<h3>Another book</h3>
$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>";
    }
    ...
}
$Ar=新阿拉伯语('entranscription');
而($item=mysql\u fetch\u数组($results)){
...
if(一些测试,看看$item['item_title']中是否有阿拉伯符号){
回显“$item[item_title](“$Ar->ar2en($item['item_title'))”)”;
}否则{
回显“$item[项目名称]”;
}
...
}
幸运的是,当输入拉丁字符时,类不会阻塞,因此理论上我可以通过转换发送所有结果,但这似乎是在浪费处理

谢谢

编辑: 我仍然没有找到一种方法来检查字形或字符。我想我可以把所有阿拉伯字符放在一个数组中,然后检查数组中是否有任何内容与字符串的一部分匹配

然而,我确实找到了一个临时解决方案,最终可能会很好地发挥作用。它将每个标题进行转换,而不考虑语言,但仅在字符串更改时输出插入式音译:

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>";
}
while($item=mysql\u fetch\u数组($mysql\u results)){
$transliterate=trim(strtolower($Ar->ar2en($item['item_title')));
$item_title=(strtolower($item['item_title'])==$translitate)?$item['item_title']:$item['item_title']。“($translitate)”;
回显“$item_title”;
}

下面是一个用于自动检测阿拉伯字符集的PHP开源类:

这应该可以做到:

preg_match("/\p{Arabic}/u", $item['item_title'])
如果你想的话,你可以让正则表达式更复杂一点,但我认为你真的不需要

允许您根据字符的Unicode属性(使用时)选择字符


PHP手册中提到:“PCRE不支持诸如“希腊语”或“InMusicalSymbols”之类的扩展属性。”但这已不再完全正确

数据库字段都设置了
utf8\u unicode\u ci
排序规则。这是否意味着它们都是utf-8编码的?这实际上是我用于音译的同一个类。可悲的是,尽管如此,Archarsted还是被我输入的任何英语字符串噎住了……我猜你已经知道了,但是。。你知道音译是最糟糕的翻译方法,正确的多语言系统(我和很多人一起工作过)使用专业人员手动翻译,并存储每种语言的文本版本。这种差异是非常明显的,从西班牙语到英语,西班牙语->英语的音译应该是“TheHouseRedBig”,而不是“TheBigRedHouse”。是的,我知道。我不是在翻译。我只是想让非阿拉伯语读者能够了解我们的图书目录的要点,因为我们现在和将来的阿拉伯语图书都是用阿拉伯语编目的。哇!什么是\p修饰符?我从来没见过!不过它工作得很好!我注意到,在某些服务器配置中,由于PCRE配置,它无法正常工作。这是真的吗?我已经澄清了我的答案。我想有些服务器的PCRE版本比较旧?是的,我认为这是我在谷歌研究中发现的主要问题——有些PHP配置使用Apache的PCRE,而不是PHP更新的、更高级的PCRE,因此带有/p的preg_match()es(或一系列其他修饰符)将失败。但我认为这是相当罕见的;我所有的服务器都使用7.0(大多数甚至是7.8)。