不能使用substr指定希伯来字母的数量

时间:2018-07-24 07:03:39

标签: php hebrew

在希伯来语书面语言中,有称为niqqud的元音标记,而不是完整字母。在英文中,“ a e i o u”是字母;在希伯来语中,它们是字母下的标记。例如,在נִקּוּד中,第一个字母(נִ)下有一个点“ i”(希伯来语从右到左读取)。每个标记都是字符,而不是字母。

我正在尝试获取希伯来语中任何单词的最后2个字母(不是字符)。问题在于函数substr()mb_substr()包含元音标记作为完整字符,因此它没有给我最后两个字母。我该怎么办?

这是我的代码:

<?php
    $array = array('סָאוּנְדּמֶן','לֵיְמֶן','דֹּמֶן','דּוֹרְמֶן','אחמד','בןהמלך');
    $dynamicstring = 'שֶׁמֶן';
    $word_strlen = strlen($dynamicstring);
    $newstring = substr($dynamicstring, -4);

    echo strlen($dynamicstring);
    echo '<br>';
    echo htmlspecialchars($newstring);
?>

3 个答案:

答案 0 :(得分:0)

使用mb_substr($ string,0,3,'UTF-8');方法,而不是使用UTF-8来指定希伯来语的正确格式

答案 1 :(得分:0)

您应该使用mb_substr();。确保还检查以下内容:

  • HTML文档设置为相同的字符集
  • 数据库连接以将数据集插入相同​​的字符集
  • 数据库表设置为相同的字符集
  • 数据库连接以将数据集提取到相同的字符集

对于希伯来语,您应该使用UTF-8作为字符集。

这应该是正确的代码:

<?php
    $array = array('סָאוּנְדּמֶן','לֵיְמֶן','דֹּמֶן','דּוֹרְמֶן','אחמד','בןהמלך');
    $dynamicstring = 'שֶׁמֶן';
    $word_strlen = mb_strlen($dynamicstring, 'UTF-8');
    $newstring = mb_substr($dynamicstring, ($word_strlen-2), $word_strlen, 'UTF-8');

    echo mb_strlen($dynamicstring);
    echo '<br>';
    echo htmlspecialchars($newstring);
?>

答案 2 :(得分:0)

substr()mb_substr()都不知道字符标记或字母。 substr()只是查看字节数,而mb_substr()则查看代码点数。由于字符标记和字母都使用单个代码点,因此mb_substr()无法区分它们。

您可以改用正则表达式:

if (preg_match('/\X\X$/u', $dynamicstring, $match)) {
    $newstring = $match[0];
}

$newstring = preg_replace('/^.*?(\X\X)$/us', '$1', $dynamicstring);

在程序中使用其中两个输出שֶׁמֶן的最后两个字母:

  

מֶן

每个\X都将匹配一个字母以及紧随其后的所有标记。表达式末尾的/u选项是打开Unicode模式(UTF-8),否则它将无法识别希伯来语代码点。

如果要使用单行preg_replace()版本,则必须在正则表达式模式的开头添加^.*?,以匹配从输入字符串开始到下一个模式的所有字符。用*?代替*是为了使其不贪心,否则它将也成为下一个序列的一部分。仅在输入中包含换行符时才需要/s选项,以允许.匹配包括换行符在内的所有字符,否则可以省去。

我建议您查看Regular-Expressions.info,尤其是the section on PHPthe section on Unicode