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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RegExp для... может создадим FAQ по RegExp? 
:(
    Опции темы
WIPS
Дата 31.8.2006, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 22.5.2006
Где: Украина, Киев

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



Очень часто бывают необходимы различные RegExp-ы, но тем кто в них не разбирается довольно сложно найти нужный или создать его самому, а для знающего ч-ка обычно не составляет особого труда написать маленький регъэкспик smile

Предлагаю все не сложные вопросы по этой теме писать сюда (напр. "проверка корректности e-mail'а RegExp-ом" и пр.), и со временем, если все пойдет хорошо можно будет на основе этой темы создать веточку в FAQ-e.

2Модераторы: заранее прошу прощения если создал тему не там, но лично меня интересуют рег. выр-я именно в применении к PHP.

Как сами понимаете, все это я затеял не для благотворительности  smile , поэтому сам и начну:

Необходим регэксп, который разбивает предложение по словам. 
Слово - это латинница-кириллица-цифры-тире-апостроф-(хотелось бы чтобы в последствии шаблон мог быть расширен др. символами). 
Все остальное - разделители, их надо выкинуть.

Вот и все, поехали!
--------------------
Автопроизводители, машины, марки, модели!
PM MAIL WWW ICQ Skype   Вверх
ZlojEzh
Дата 31.8.2006, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.10.2005
Где: Киев, Украина

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



Код

preg_split("#[^а-яА-Я\w\d\-']+#i",$text,-1,PREG_SPLIT_NO_EMPTY);

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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 22.5.2006
Где: Украина, Киев

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



2ZlojEzh, спасибо, работает как просил!

Есть вопросы. 
1. Вот это:
Код

[^а-яА-Я\w\d\-']+
вроде понятно. Т.е. мы говорим, что разделитель - это один и более (+) символов из множества ([]), которое состоит из всех символов не (^) являющихся кириллицей (а-яА-Я), латинницей (\w), десятичными цифрами (\d), тире(\-) или апострофом('). А вот зачем здесь "#" и "#i" непонятно smile Но без них определенно не работает smile 

2. Как добавить символ(ы) понятно, будет типа такого:
Код

$additional_symbols = "@!";
preg_split("#[^а-яА-Я\w\d\-'".$additional_symbols."]+#i", $text, -1, PREG_SPLIT_NO_EMPTY);


3. Можно ли модифицировать шаблон так, чтобы слова состоящие из одних апострофов, тире и их комбинаций тоже отбрасывались?

4. Можно ли модифицировать шаблон так, чтобы слова короче $n символов не входили в результат?
--------------------
Автопроизводители, машины, марки, модели!
PM MAIL WWW ICQ Skype   Вверх
ZlojEzh
Дата 1.9.2006, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.10.2005
Где: Киев, Украина

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



Цитата(WIPS @  31.8.2006,  16:42 Найти цитируемый пост)
А вот зачем здесь "#" и "#i" непонятно  Но без них определенно не работает  

символ # ограничивает регулярное выражение, отделяет его от модификаторов (вместо него можно использовать и другой)
i - модификатор, устанавливает игнорирование регистра символов
Цитата(WIPS @  31.8.2006,  16:42 Найти цитируемый пост)
3. Можно ли модифицировать шаблон так, чтобы слова состоящие из одних апострофов, тире и их комбинаций тоже отбрасывались?

Код

preg_split("#([^а-яА-Я\w\d\-']+[\-']+|[\-']+[^а-яА-Я\w\d\-']+|[^а-яА-Я\w\d\-']+)".$additional_symbols."]+#i", $text, -1, PREG_SPLIT_NO_EMPTY);

ужас... посмотрел на рег и самому не по себе стало
этот рег еще обрубает дефисы и апострофы на краях слов
Цитата(WIPS @  31.8.2006,  16:42 Найти цитируемый пост)
Можно ли модифицировать шаблон так, чтобы слова короче $n символов не входили в результат?

для preg_split это сделать сложно
переделывать рег под preg_match влом, если чесно... )
PM MAIL ICQ   Вверх
WIPS
Дата 1.9.2006, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 22.5.2006
Где: Украина, Киев

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



Цитата(ZlojEzh @  1.9.2006,  08:52 Найти цитируемый пост)
символ # ограничивает регулярное выражение

Т.е., чтобы ограничить регулярное выражение нам надо два символа "#", то что между ними - RegExp, а за ними - модификаторы? Я правильно понял?

Цитата(ZlojEzh @  1.9.2006,  08:52 Найти цитируемый пост)
(вместо него можно использовать и другой)

Какой другой? Можно поподробнее?

Цитата(ZlojEzh @  1.9.2006,  08:52 Найти цитируемый пост)
посмотрел на рег и самому не по себе стало

Мне тоже стало не по себе  smile Кроме того я читал, что использование "|" в регекспах сильно замедляет работу, поэтому предлагаю свое решение:
Код

preg_split("#[\-']*[^а-яА-Я\w\d\-']+[\-']*#i", $text, -1, PREG_SPLIT_NO_EMPTY);

Функциональность вроде та же, что и у твоего. Если я что-то упустил, буду рад замечаниям...

А убирание слов меньше $n символов остается в силе smile Может кто-то таки напишет?
--------------------
Автопроизводители, машины, марки, модели!
PM MAIL WWW ICQ Skype   Вверх
WIPS
Дата 1.9.2006, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 22.5.2006
Где: Украина, Киев

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



Цитата(WIPS @  1.9.2006,  14:42 Найти цитируемый пост)
А убирание слов меньше $n символов остается в силе smile Может кто-то таки напишет? 

... вроде получилось, но с использованием "|" ($n = 3):
Код

preg_split("#([\-']*[^а-яА-Я\w\d\-']+[\-']*[а-яА-Я\w\d\-']{0,3}[\-']*[^а-яА-Я\w\d\-']+[\-']*|[\-']*[^а-яА-Я\w\d\-']+[\-']*)#i", $text, -1, PREG_SPLIT_NO_EMPTY);


правда возник один вопрос, если помнять местами части по разные стороны от "|" - меняется результат, т.е.:
Код

// This code works as needed:
preg_split("#([\-']*[^а-яА-Я\w\d\-']+[\-']*[а-яА-Я\w\d\-']{0,3}[\-']*[^а-яА-Я\w\d\-']+[\-']*|[\-']*[^а-яА-Я\w\d\-']+[\-']*)#i", $text, -1, PREG_SPLIT_NO_EMPTY);
// and this one not :(
preg_split("#([\-']*[^а-яА-Я\w\d\-']+[\-']*|[\-']*[^а-яА-Я\w\d\-']+[\-']*[а-яА-Я\w\d\-']{0,3}[\-']*[^а-яА-Я\w\d\-']+[\-']*)#i", $text, -1, PREG_SPLIT_NO_EMPTY);

ведь "|" означает ИЛИ насколько я понимаю, тогда почему результаты разные? 
(true OR false ==  false OR true)
--------------------
Автопроизводители, машины, марки, модели!
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0463 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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