Считайте цифры как отдельные слова, используя str_word_count в PHP

Я пытаюсь использовать str_word_count для подсчета количества слов в сообщении.

$wordcount = str_word_count($message,0,'0123456789');

Я могу с уверенностью сказать, что там будут только слова, числа и пробелы. Сообщение является результатом закодированной речи в текстовое сообщение.

Одна вещь, с которой я борюсь, - заставить ее правильно возвращать нужное количество слов. Мне нужно, чтобы каждая цифра считалась отдельным словом. Таким образом, «4 5 6» — это 3 слова, и «456» — тоже 3 слова. «ЧЕТЫРЕ» — это одно слово, «ЧЕТЫРЕ 44» — это 3 слова и т. д.

В документации для этой функции сказано, что я должен можно сделать это, указав символы, которые будут считаться словами, в качестве третьего аргумента, что я и сделал. Однако весь «блок» цифр по-прежнему считается только одним словом. Я попытался добавить пробелы между цифрами, но это визуально вызвало синтаксическую ошибку в Notepad++ и, по сути, взорвало всю мою PHP-страницу.

Я думал отфильтровать строку по цифрам, а затем добавить ее длину к количеству слов, но тогда я наверняка дважды считаю некоторые цифры... и это просто беспорядок!

Есть ли какой-либо способ сделать это изначально с помощью str_word_count?


person InterLinked    schedule 18.05.2019    source источник
comment
Можно ли получить слово, похожее на 1two3?   -  person Nick    schedule 19.05.2019
comment
@Ник В моем случае нет. Я не знаю, что бы я хотел, чтобы произошло тогда, потому что это не входит в критерии. Ввод является результатом преобразования речи в текст, поэтому получить 1two3 в любом случае будет почти невозможно!   -  person InterLinked    schedule 19.05.2019


Ответы (1)


Один из способов обойти это — сначала использовать preg_replace для разбейте свои строки цифр на отдельные цифры, а затем посчитайте слова. Например:

$message = "I have 123 chickens";
$message = preg_replace('/\s*(\d)/', ' $1', $message);
$wordcount = str_word_count($message, 0, '0123456789');
echo $wordcount;

Вывод

6

Демо на 3v4l.org

person Nick    schedule 18.05.2019
comment
Это решение выводит 5, если строка «У меня есть 1two3 цыплята», тогда как должно выводить 6. - person ; 18.05.2019
comment
@parsonsbots в вопросе ОП нет указаний на то, что 1two3 является допустимым словом (они упоминают слова, числа и пробелы, и обычно слова означают последовательности букв, а не что-то вроде 1two3). Кажется немного суровым отрицать, основываясь на возможном сценарии, который не упоминается в вопросе. - person Nick; 18.05.2019
comment
Сообщение является результатом закодированной речи в текстовое сообщение. - 1zero1 может быть возможным выходом для 101 в грубой речи для кодирования текста, но я уберу отрицательный голос (как только будет снято почасовое ограничение). - person ; 18.05.2019
comment
@parsonsbots STT, который я использую, этого не сделал. У меня также есть предварительная обработка, которая выполняется перед отправкой на главный сервер. - person InterLinked; 19.05.2019