Php Can';t使用substr指定希伯来文字母的数量

Php Can';t使用substr指定希伯来文字母的数量,php,hebrew,Php,Hebrew,在书面希伯来语中,元音有标记,称为niqqd,而不是完整的字母。英语中的“aeiou”是字母;在希伯来语中,它们是字母下面的标记。例如,在נִקּּּד中,第一个字母(נִ)下面有一个表示“i”的点(希伯来语从右向左读)。每个标记都是一个字符,但不是一个字母 我正在尝试获取任何希伯来语单词的最后两个字母(不是字符)。问题是函数:substr()和mb_substr()包含元音标记作为完整字符,因此它没有给出最后两个字母。我能做什么 这是我的密码: <?php $array = ar

在书面希伯来语中,元音有标记,称为niqqd,而不是完整的字母。英语中的“aeiou”是字母;在希伯来语中,它们是字母下面的标记。例如,在נִקּּּד中,第一个字母(נִ)下面有一个表示“i”的点(希伯来语从右向左读)。每个标记都是一个字符,但不是一个字母

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

这是我的密码:

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

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

使用mb_substr($string,0,3,'UTF-8');方法,而不是UTF-8,指定您应该使用的希伯来语的正确格式。确保您还检查了以下各项:

  • 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);
?>

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

您可以改为使用正则表达式:

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

在您的程序中使用这两个字母中的任何一个,输出שֶׁןֶן的最后两个字母:

מֶן

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

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


我建议查看Regular-Expressions.info,尤其是和。

请将您的尝试代码添加为weel@DarkBee添加了感谢@NigelRen的可能副本不,不是,我这里的问题是关于希伯来文的评分。不same@din除了使用
mb_substr
,您当然也需要使用。我已经尝试过了,但它不起作用(另外,我需要最后2个字符,所以它必须是:$string,-4,0,'UTF-8',正如我在另一条评论中所说,我已经使用了这个。我没有使用SQL,所以这不是问题。我正在尝试用mb_substr做你说的事情,但它不起作用。我需要最后2个字符。)
$newstring = preg_replace('/^.*?(\X\X)$/us', '$1', $dynamicstring);