Я не очень хорошо знаком с регулярным выражением, но я хочу использовать его для извлечения слов из строки.
Слова, которые мне нужны, должны иметь минимум 4 символа, а предоставленная строка может быть utf8.
Пример строки:
Sus azahares presentan gruesos pétalos blancos teñidos de rosa o violáceo en la parte externa, con numerosos estambres (20-40).
Желаемый результат:
Array( [0] => azahares [1] => presentan [2] => gruesos [3] => pétalos [4] => blancos [5] => teñidos [6] => rosa [7] => violáceo [8] => parte [9] => externa [10] => numerosos [11] => estambres )
Это работает, если искать слова UTF-8 (по крайней мере, 4 символа в соответствии с спецификациями), состоящий из буквенных символов ISO-8859-15 (что отлично подходит для испанского, а также для английского, немецкого, французского, и т.д.):
$n_words = preg_match_all('/([a-zA-Z]|\xC3[\x80-\x96\x98-\xB6\xB8-\xBF]|\xC5[\x92\x93\xA0\xA1\xB8\xBD\xBE]){4,}/', $str, $match_arr); $word_arr = $match_arr[0];
Вы можете использовать регулярное выражение ниже для простых строк. Он будет соответствовать любым символам без пробелов с минимальной длиной = 4.
preg_match_all('/(\S{4,})/i', $str, $m);
Теперь $m[1]
содержит требуемый массив.
Обновить:
Как сказал Гордон, картина также будет соответствовать «(20-40)». Нежелательные номера можно удалить с помощью этого регулярного выражения:
preg_match_all('/(\pL{4,})/iu', $str, $m);
Но я думаю, что это работает, только если PCRE скомпилирован с поддержкой UTF-8. См. PHP PCRE (regex) не поддерживает UTF-8? , Однако он работает на моем компьютере.
это должно сделать для вас работу
function extractCommonWords($string) { $stopWords = array('i','a','about','an','and','are','as','at','be','by','com','de','en','for','from','how','in','is','it','la','of','on','or','that','the','this','to','was','what','when','where','who','will','with','und','the','www'); $string = preg_replace('/\s\s+/i', '', $string); //echo $string, "<br /><br />"; // replace whitespace $string = trim($string); // trim the string $string = preg_replace('/[^a-zA-Z0-9 -_]/', '', $string); // only take alphanumerical characters, but keep the spaces and dashes too… $string = strtolower($string); // make it lowercase preg_match_all('/([a-zA-Z]|\xC3[\x80-\x96\x98-\xB6\xB8-\xBF]|\xC5[\x92\x93\xA0\xA1\xB8\xBD\xBE]){4,}/', $string, $matchWords); $matchWords = $matchWords[0]; foreach($matchWords as $key => $item) { if($item == '' || in_array(strtolower($item), $stopWords) || strlen($item) <= 3) { unset($matchWords[$key]); } } $wordCountArr = array(); if(is_array($matchWords)) { foreach($matchWords as $key => $val) { $val = strtolower($val); if(isset($wordCountArr[$val])) { $wordCountArr[$val]++; } else { $wordCountArr[$val] = 1; } } } arsort($wordCountArr); $wordCountArr = array_slice($wordCountArr, 0, 10); return $wordCountArr; }
неfunction extractCommonWords($string) { $stopWords = array('i','a','about','an','and','are','as','at','be','by','com','de','en','for','from','how','in','is','it','la','of','on','or','that','the','this','to','was','what','when','where','who','will','with','und','the','www'); $string = preg_replace('/\s\s+/i', '', $string); //echo $string, "<br /><br />"; // replace whitespace $string = trim($string); // trim the string $string = preg_replace('/[^a-zA-Z0-9 -_]/', '', $string); // only take alphanumerical characters, but keep the spaces and dashes too… $string = strtolower($string); // make it lowercase preg_match_all('/([a-zA-Z]|\xC3[\x80-\x96\x98-\xB6\xB8-\xBF]|\xC5[\x92\x93\xA0\xA1\xB8\xBD\xBE]){4,}/', $string, $matchWords); $matchWords = $matchWords[0]; foreach($matchWords as $key => $item) { if($item == '' || in_array(strtolower($item), $stopWords) || strlen($item) <= 3) { unset($matchWords[$key]); } } $wordCountArr = array(); if(is_array($matchWords)) { foreach($matchWords as $key => $val) { $val = strtolower($val); if(isset($wordCountArr[$val])) { $wordCountArr[$val]++; } else { $wordCountArr[$val] = 1; } } } arsort($wordCountArr); $wordCountArr = array_slice($wordCountArr, 0, 10); return $wordCountArr; }
Разверните строку с пробелами (которые создадут массив со всеми словами), а затем проверьте, превышает ли это слово 4 буквы.
//The string you want to explode $string = "Sus azahares presentan gruesos pétalos blancos teñidos de rosa o violáceo en la parte externa, con numerosos estambres." //explode your $string, which will create an array which we will call $words $words = explode(' ', $string); //for each $word in $words foreach($words as $word) { //check if $word length if larger then 4 if(strlen($word) > 4) { //echo the $word echo $word; } }
StrLen ();
strlen – Получить длину строки
взорваться ();
explode – Разбить строку по строке
Когда вы используете модификатор u
, вы можете использовать следующий шаблон ( demo ):
preg_match_all('(\w{4,})u', $string, $matches); print_r($matches[0]);
Модификатор u
означает:
u (PCRE_UTF8): Этот модификатор включает дополнительные функции PCRE, которые несовместимы с Perl. Строки шаблонов рассматриваются как UTF-8. Этот модификатор доступен с PHP 4.1.0 или выше в Unix и с PHP 4.2.3 на win32. Срок действия шаблона UTF-8 проверяется с PHP 4.3.5.
$string = Sus azahares presentan gruesos pétalos blancos teñidos de rosa o violáceo en la parte externa, con numerosos estambres $words = explode(' ', $string); echo $words[0]; echo $words[1];
и так далее
Попробуй это:
$str='Sus azahares presentan gruesos pétalos blancos teñidos de rosa o violáceo en la parte externa, con numerosos estambres (20-40).'; preg_match_all('/([^0-9\s]){4,}/i', $str, $matches); echo '<pre>'; var_dump($matches); echo '</pre>';