在希伯来语书面语言中,有称为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);
?>
答案 0 :(得分:0)
使用mb_substr($ string,0,3,'UTF-8');方法,而不是使用UTF-8来指定希伯来语的正确格式
答案 1 :(得分:0)
您应该使用mb_substr();。确保还检查以下内容:
对于希伯来语,您应该使用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 PHP和the section on Unicode。