Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Найти все слова начинающиеся с подстроки
 
 автор: puper   (09.09.2009 в 19:30)   письмо автору
 
 

Помогите, пожалуйста, написать регулярку.
Есть текст:

Банкир, банк. Банкротство можно избежать.
банкрот! банки? БАНК.

при вводе слова "банк" получить слова, которые начинаются на него (в массиве):
Банкир
Банкротство
банкрот
банки
банк


При вводе словосочетания из двух словоформ начинающихся, например, на "банкротство мо", получить целую фразу из 2-х только слов, т.е.: "Банкротство можно"


(ЗАМЕТЬТЕ, что слова в результате не должны повторяться)

  Ответить  
 
 автор: heed   (09.09.2009 в 21:16)   письмо автору
 
   для: puper   (09.09.2009 в 19:30)
 

> из двух словоформ
не понял о чём речь,
но "мо" можно вставить например в такое выражение
<pre><?
$txt
=<<<TXT
Банкир, банк. Банкротство можно избежать.
банкрот! банки? БАНК.
консервная банка
 из под чего-нибудь
банкоматы, госбанк
банкомёты
TXT
;
$re '#\bбанк[А-яЁё]*(?:\s+[А-яЁё]+)?#i';

preg_match_all($re$txt$array);
var_dump($array);
?>

>слова в результате не должны повторяться

проще сделать это с помощью array_unique(), но если не подходит, в preg_replace_callback() есть возможность обрабатывать результаты совпадений в процессе их нахождения

//поправил
забыл добавить модификатор i

  Ответить  
 
 автор: puper   (09.09.2009 в 23:03)   письмо автору
 
   для: heed   (09.09.2009 в 21:16)
 

Почему-то Ваше РВ не работает...

я вот тут, написал такое:

#банк[^ ,.!?]+#i


только почему-то иногда в массив заносится первое слово и часть второго

  Ответить  
 
 автор: heed   (09.09.2009 в 23:17)   письмо автору
 
   для: puper   (09.09.2009 в 23:03)
 

почему второе, это видимо потому что между ними не пробелы, а перенсы строк.
можно попробовать заменоить пробел на \s
, а вот почему часть , даже интересно, не смог получить такой эффект

  Ответить  
 
 автор: heed   (09.09.2009 в 23:26)   письмо автору
 
   для: puper   (09.09.2009 в 23:03)
 

У меня если юникод (win32XP) не работает с \b
, только например так $re = '#(?<=\s)банк[^\s,.!?]*#iu';

  Ответить  
 
 автор: Trianon   (09.09.2009 в 23:41)   письмо автору
 
   для: heed   (09.09.2009 в 23:26)
 

preg-функции не работают с прямым юникодом - только с utf-8.
Но для работы с последним нужно применять соответствующий модификатор.

  Ответить  
 
 автор: heed   (10.09.2009 в 00:04)   письмо автору
 
   для: Trianon   (09.09.2009 в 23:41)
 

его utf-8 и имел ввиду
, с модификатором всёравно не работает \b метасимвол начала или конца слова
, а других, таких как [[:<:]] и [[:>:]] нету
, но возможно просто потому что utf-8 локаль не выставляется на xp
проверить где-то ещё сейчас нет возможности

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования