Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Количество букс в строке.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
jonston
Отправлено: 24 Марта, 2014 - 12:42:26
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




Здравствуйте.Как вытянуть с помощью одного регулярного выражения все вхождения букв кириллицы в строке, а потом вывести в рейтинге по убыванию?


-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
teddy
Отправлено: 24 Марта, 2014 - 12:54:18
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




PHP:
скопировать код в буфер обмена
  1. $str = 'ПриветHelloДядяUncleВасяVasya';
  2. preg_match_all('/([^a-z])/iu', $str, $matches);
  3. $result = implode(', ', array_reverse($matches[0]));
  4. echo $result;

оно?
 
 Top
jonston
Отправлено: 24 Марта, 2014 - 13:05:56
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




teddy пишет:
PHP:
скопировать код в буфер обмена
  1. $str = 'ПриветHelloДядяUncleВасяVasya';
  2. preg_match_all('/([^a-z])/iu', $str, $matches);
  3. $result = implode(', ', array_reverse($matches[0]));
  4. echo $result;

оно?


Не не оно.


-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
teddy
Отправлено: 24 Марта, 2014 - 13:09:52
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Брр... )))

А точнее, что не так? Нашли все буквы, перевернули и все...
 
 Top
VenZell
Отправлено: 24 Марта, 2014 - 13:10:08
Post Id


Частый гость


Покинул форум
Сообщений всего: 237
Дата рег-ции: Июнь 2013  


Помог: 12 раз(а)




Посмотреть пример
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $string = 'аабвввгдеN1жЗёёё4_ё';
  3. $matches = array();
  4. $res = array();
  5. preg_match_all('/[а-яА-ЯёЁ]+?/u', $string, $matches);
  6. foreach ($matches[0] as $match) {
  7.    $res[$match] = isset($res[$match]) ? ++$res[$match] : 1;
  8. }
  9. array_multisort(array_values($res), SORT_DESC, array_keys($res), SORT_ASC, $res);
  10. print_r($res);


Выведет:
CODE (text):
скопировать код в буфер обмена
  1. Array
  2. (
  3.     [ё] => 4
  4.     [в] => 3
  5.     [а] => 2
  6.     [З] => 1
  7.     [б] => 1
  8.     [г] => 1
  9.     [д] => 1
  10.     [е] => 1
  11.     [ж] => 1
  12. )
 
 Top
jonston
Отправлено: 24 Марта, 2014 - 13:17:42
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




teddy пишет:
PHP:
скопировать код в буфер обмена
  1. $str = 'ПриветHelloДядяUncleВасяVasya';
  2. preg_match_all('/([^a-z])/iu', $str, $matches);
  3. $result = implode(', ', array_reverse($matches[0]));
  4. echo $result;

оно?


Посмотри пример ниже.Но все равно спасибо.
(Добавление)
VenZell пишет:

Выведет:
CODE (text):
скопировать код в буфер обмена
  1. Array
  2. (
  3.     [ё] => 4
  4.     [в] => 3
  5.     [а] => 2
  6.     [З] => 1
  7.     [б] => 1
  8.     [г] => 1
  9.     [д] => 1
  10.     [е] => 1
  11.     [ж] => 1
  12. )

Вот так только заглавные буквы нужно совместить со строчными


-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
VenZell
Отправлено: 24 Марта, 2014 - 13:26:04
Post Id


Частый гость


Покинул форум
Сообщений всего: 237
Дата рег-ции: Июнь 2013  


Помог: 12 раз(а)




jonston, тогда так.
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $string = 'аабвввгдеN1жЗёёё4_ёзззз';
  3. $matches = array();
  4. $res= array();
  5. preg_match_all('/[а-яА-ЯёЁ]+?/u', $string, $matches);
  6. foreach ($matches[0] as $match) {
  7.    $key = mb_strtolower($match, 'UTF-8');
  8.    $res[$key] = isset($res[$key]) ? ++$res[$key] : 1;
  9. }
  10. array_multisort(array_values($res), SORT_DESC, array_keys($res), SORT_ASC, $res);
  11. print_r($res);

(Отредактировано автором: 24 Марта, 2014 - 13:27:04)

 
 Top
EuGen Администратор
Отправлено: 24 Марта, 2014 - 13:39:42
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




PHP:
скопировать код в буфер обмена
  1. //utf-8
  2. $string = 'Glq гмГ sЙz Мок';
  3.    preg_split('/[^А-Яа-яЁё]*/u', mb_strtoupper($string, 'UTF-8'), -1, 1)
  4. );
  5. arsort($result);
  6. //var_dump($result);

?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Ch_chov
Отправлено: 24 Марта, 2014 - 13:43:36
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




PHP:
скопировать код в буфер обмена
  1. header('Content-Type: text/html; charset=windows-1251');
  2. $str = 'тТаабААвввгдеN1жЗёёё4_ё';
  3.  
  4. $str = preg_replace('/[^а-яё]/i', '', strtolower($str));
  5. $result = count_chars($str, 1);
  6. arsort($result);
  7. foreach ($result as $i => $val) {
  8.    echo chr($i) , " => $val<br/>";
  9. }
  10.  

Для utf-8 нужно будет перекодировать строку.
 
 Top
jonston
Отправлено: 24 Марта, 2014 - 14:03:45
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




Спасибо.Все работает.Только есть один нюанс.Нужно таким образом получить количество вхождений букв в очень большом объеме текста (книга "война и мир").


-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
IllusionMH
Отправлено: 24 Марта, 2014 - 14:15:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




jonston, регуляркой как вы хотите не прокатит. Разбивать на сегменты и анализировать отдельно, потом складывать результат.
 
 Top
jonston
Отправлено: 24 Марта, 2014 - 14:17:11
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




IllusionMH пишет:
jonston, регуляркой как вы хотите не прокатит. Разбивать на сегменты и анализировать отдельно, потом складывать результат.

Что если mb_substr_count()?


-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
EuGen Администратор
Отправлено: 24 Марта, 2014 - 14:24:32
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Объём большой = нельзя загрузить в память. Это означает, что можно попросту читать байты последовательно в цикле и увеличивать счётчик соответствующего ключа результирующего массива. fgetc, например (хотя для кириллицы лучше всё же fread)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
jonston
Отправлено: 24 Марта, 2014 - 14:29:05
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




EuGen пишет:
Объём большой = нельзя загрузить в память. Это означает, что можно попросту читать байты последовательно в цикле и увеличивать счётчик соответствующего ключа результирующего массива. fgetc, например (хотя для кириллицы лучше всё же fread)

А можно пример, а то с бинарными данными как то туговато.


-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
EuGen Администратор
Отправлено: 24 Марта, 2014 - 14:52:19
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Что-либо наподобие:

PHP:
скопировать код в буфер обмена
  1. define('FILTER_ALL', 0);
  2. define('FILTER_CYRILLIC', 1);
  3.  
  4. function getCharUTF($file, $filter=FILTER_ALL)
  5. {
  6.    if(!feof($file) && $one = fgetc($file))
  7.    {
  8.       if(ord($one)>127 && !feof($file) && $two=fgetc($file))
  9.       {
  10.          return $one.$two;
  11.       }
  12.       return $filter!=FILTER_CYRILLIC?$one:null;
  13.    }
  14. }
  15.  
  16. $path = '/path/to/file.txt';
  17. $file = fopen($path, 'r');
  18. $chars = [];
  19. while(!feof($file))
  20. {
  21.    if($c = mb_strtoupper(getCharUTF($file, FILTER_CYRILLIC), 'UTF-8'))
  22.    {
  23.       $chars[$c] = isset($chars[$c])?$chars[$c]+1:1;
  24.    }
  25. }
  26. fclose($file);
  27. arsort($chars);


Здесь нет "точной" выборки кириллицы (поскольку всё, что не попадает в нижнюю половину ASCII, мы считаем как "кириллицу")


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB