Я сделал следующую функцию для возврата определенного количества слов из текста:
function brief_text($text, $num_words = 50) { $words = str_word_count($text, 1); $required_words = array_slice($words, 0, $num_words); return implode(" ", $required_words); }
и он отлично работает с английским языком, но когда я пытаюсь использовать его на арабском языке, он терпит неудачу и не возвращает слов, как ожидалось. Например:
$text_en = "Cairo is the capital of Egypt and Paris is the capital of France"; echo brief_text($text_en, 10);
выйдет Cairo is the capital of Egypt and Paris is the
время
$text_ar = "القاهرة هى عاصمة مصر وباريس هى عاصمة فرنسا"; echo brief_text($text_ar, 10);
выведет
.
Я знаю, что проблема str_word_count
функцией str_word_count
но я не знаю, как ее исправить.
ОБНОВИТЬ
Я уже написал еще одну функцию, которая хорошо работает с английским и арабским языками, но я искал решение проблемы, вызванное str_word_count()
при использовании с арабским. Во всяком случае, вот моя другая функция:
function brief_text($string, $number_of_required_words = 50) { $string = trim(preg_replace('/\s+/', ' ', $string)); $words = explode(" ", $string); $required_words = array_slice($words, 0, $number_of_required_words); // get sepecific number of elements from the array return implode(" ", $required_words); }
Попробуйте использовать эту функцию для подсчета слов:
// You can call the function as you like if (!function_exists('mb_str_word_count')) { function mb_str_word_count($string, $format = 0, $charlist = '[]') { mb_internal_encoding( 'UTF-8'); mb_regex_encoding( 'UTF-8'); $words = mb_split('[^\x{0600}-\x{06FF}]', $string); switch ($format) { case 0: return count($words); break; case 1: case 2: return $words; break; default: return $words; break; } }; } echo mb_str_word_count("القاهرة هى عاصمة مصر وباريس هى عاصمة فرنسا") . PHP_EOL;
<meta charset="UTF-8"/>
в файлах HTML Content-type: text/html; charset=utf-8
Content-type: text/html; charset=utf-8
при обслуживании страниц Для приема символов ASCII:
if (!function_exists('mb_str_word_count')) { function mb_str_word_count($string, $format = 0, $charlist = '[]') { $string=trim($string); if(empty($string)) $words = array(); else $words = preg_split('~[^\p{L}\p{N}\']+~u',$string); switch ($format) { case 0: return count($words); break; case 1: case 2: return $words; break; default: return $words; break; } } }