Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Водность текста 
:(
    Опции темы
sanitarn
Дата 25.6.2015, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 3.10.2014

Репутация: нет
Всего: нет



Всем привет, возник вопрос, хочу банально сделать форму дял ввода текста, после просчет его водности и тошноты, так вот.
Имею текст, нужно найти в тексте все точные вхождения из массива, затык в том, что через preg_match_all он находит все что угодно, то есть cat и catalog, а нужно точное совпадение.
PM MAIL   Вверх
ksnk
Дата 25.6.2015, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Ну дык и искать надо  '#\bcat\b#', чтобы не попадался catalog

Это сообщение отредактировал(а) ksnk - 25.6.2015, 17:22


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
sanitarn
Дата 25.6.2015, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 3.10.2014

Репутация: нет
Всего: нет



Цитата(ksnk @  25.6.2015,  17:22 Найти цитируемый пост)
Ну дык и искать надо  '#\bcat\b#', чтобы не попадался catalog

Не вариант, так ничего не находит:
Код

$stopwords = array('потому что',' Я','ты','люб');
$text = "потому что Любимый мой! бы то ни было Я хочу сказать тебе, что ты у меня самый любимый!";


foreach ($stopwords as $slovo)
{



 preg_match_all ("/\b$slovo\b/", $text, $matches);

 print_r($matches);


PM MAIL   Вверх
sanitarn
Дата 25.6.2015, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 3.10.2014

Репутация: нет
Всего: нет



Решил таким способом  preg_match_all ('/\s+'.$slovo.'\s+/', $text, $matches);

PM MAIL   Вверх
ksnk
Дата 25.6.2015, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



И что, первое слово тоже ловит?

Я бы делал вот так
Код

preg_match_all ('/\b'.preg_replace('/\s+/','\s+',preg_quote(trim($slovo))).'\b/', $text, $matches);

, но пример и так нормально работает и в первом и во втором случае выдает 
Код

Array
(
    [0] => Array
        (
            [0] => потому что
        )

)
Array
(
    [0] => Array
        (
            [0] =>  Я
        )

)
Array
(
    [0] => Array
        (
            [0] => ты
        )

)
Array
(
    [0] => Array
        (
        )

)


Добавлено через 3 минуты и 5 секунд
Для UTF-8 лучше добавить модификатор /u в регулярку и /s для поиска по многострочным строкам.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
baldina
Дата 25.6.2015, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



Цитата(sanitarn @  25.6.2015,  17:27 Найти цитируемый пост)
так ничего не находит

Цитата(sanitarn @  25.6.2015,  17:27 Найти цитируемый пост)
"/\b$slovo\b/"


еще бы. в двойных кавычках спецсимволы экранируют.
Код

"/\\b$slovo\\b/"


но '\b' в данном случае это не то что надо, т.к. ищутся не слова (с точки зрения preg).
так что 
Код

'/(?:^|\s)'.trim($slovo).'(?:\s|$)/'


Добавлено через 2 минуты и 16 секунд
Цитата(ksnk @  25.6.2015,  19:19 Найти цитируемый пост)
Я бы делал вот так

ну или да))
PM MAIL   Вверх
sanitarn
Дата 26.6.2015, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 3.10.2014

Репутация: нет
Всего: нет



Спасибо, а теперь такой вопрос, как посчитать сколько данных найдено в каждом массиве? При помощи count, но как? Суммировать все данные?
PM MAIL   Вверх
ksnk
Дата 26.6.2015, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



sanitarn, count($matches[0]), если что нашлось.

Добавлено через 1 минуту и 58 секунд
baldina, Для вот такого примера - использование ограничителей-пробелов не будет работать. Слово Я не удастся найти 3 раза.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
sanitarn
Дата 26.6.2015, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 3.10.2014

Репутация: нет
Всего: нет



Цитата(ksnk @  26.6.2015,  13:01 Найти цитируемый пост)
sanitarn, count($matches[0]), если что нашлось.

Да не, вывести сколько данных в каждом массиве я знаю, как их все суммировать то? Как то в цикле?
Получил к примеру такие данные:
0
1
0
1
0
0
0
0
0
8
0
1
1
0
PM MAIL   Вверх
baldina
Дата 26.6.2015, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



Цитата(ksnk @  26.6.2015,  13:01 Найти цитируемый пост)
Для вот такого примера

согласен
PM MAIL   Вверх
ksnk
Дата 26.6.2015, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Ну да, наверное, в том же цикле, что и слова ищешь. Задача-то какая стоит?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
sanitarn
Дата 26.6.2015, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 3.10.2014

Репутация: нет
Всего: нет



Цитата(ksnk @  26.6.2015,  14:08 Найти цитируемый пост)
Ну да, наверное, в том же цикле, что и слова ищешь. Задача-то какая стоит? 

Задача найти все вхождения и в последствие то что нашлось суммировать.
PM MAIL   Вверх
ksnk
Дата 26.6.2015, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



И что не получилось?
+=  ?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
sanitarn
Дата 26.6.2015, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 3.10.2014

Репутация: нет
Всего: нет



Цитата(ksnk @  26.6.2015,  15:18 Найти цитируемый пост)
+=  ? 



Цитата(ksnk @  26.6.2015,  15:18 Найти цитируемый пост)
И что не получилось?
+=  ?


Да банально не понимаю как в данном случае сложить все данные в  этих массивах. (пропустил видимо я данный раздел в мануале )  smile

PM MAIL   Вверх
ksnk
Дата 26.6.2015, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цикл есть? Вроде есть  smile 
Снаружи заведи переменную. $summ , к примеру.
В цикле прибавляй к ней нужные значения
$summ+=count($matches[0]);

Цикл  кончился - в переменной все вхождения всех стопслов.

Это было нужно?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
sanitarn
Дата 26.6.2015, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 3.10.2014

Репутация: нет
Всего: нет



Цитата(ksnk @  26.6.2015,  16:06 Найти цитируемый пост)
Цикл есть? Вроде есть  smile 
Снаружи заведи переменную. $summ , к примеру.
В цикле прибавляй к ней нужные значения
$summ+=count($matches[0]);

Цикл  кончился - в переменной все вхождения всех стопслов.

Это было нужно? 

Пример можно,  а то у меня мозг взорвется, вроде банальщина, а включить мозг все не могу.

PM MAIL   Вверх
ksnk
Дата 26.6.2015, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Так ?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
sanitarn
Дата 27.6.2015, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 3.10.2014

Репутация: нет
Всего: нет



Цитата(ksnk @  26.6.2015,  18:48 Найти цитируемый пост)
Так ? 

Вечером посмотрю и потестирую обязательно, скорее всего так, спс.

PM MAIL   Вверх
sanitarn
Дата 1.7.2015, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 3.10.2014

Репутация: нет
Всего: нет



Еще раз спасибо, сейчас проверил, то что хотел, правда вопрос, зачем так сильно строчку усложнять?
Код

(preg_match_all ('/\b'.preg_replace('/\s+/','\s+',preg_quote(trim($slovo))).'\b/us', $text, $matches))

И почему вы используете printf ?
PM MAIL   Вверх
ksnk
Дата 1.7.2015, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(sanitarn @  1.7.2015,  15:40 Найти цитируемый пост)
зачем так сильно строчку усложнять?

Представь, что стоп-словом будет, например значек копирайта - `(с)`. Что случится с регуляркой без preg_quote, Что случится, если фраза содержит 2 пробела в стоп-фразе, если не использовать замену пробела на "пробельные символы"? Какие еще усложнения представляются "лишними"?

С printf, imho, фраза, которая выводится на экран более наглядна. Редактировать ее тоже проще, не надо разбираться в сложных кавычках при операциях конкатенации.

Это сообщение отредактировал(а) ksnk - 1.7.2015, 15:54


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
sanitarn
Дата 1.7.2015, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 3.10.2014

Репутация: нет
Всего: нет



Цитата(ksnk @  1.7.2015,  15:53 Найти цитируемый пост)
Представь, что стоп-словом будет, например значек копирайта - `(с)`. Что случится с регуляркой без preg_quote, Что случится, если фраза содержит 2 пробела в стоп-фразе, если не использовать замену пробела на "пробельные символы"? Какие еще усложнения представляются "лишними"?

С printf, imho, фраза, которая выводится на экран более наглядна. Редактировать ее тоже проще, не надо разбираться в сложных кавычках при операциях конкатенации.

Благодарю за содержательный ответ!!!
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0782 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.