За последние 24 часа нас посетили 20089 программистов и 1670 роботов. Сейчас ищут 1856 программистов ...

Обрамить слова и выкинуть все остальное.

Тема в разделе "Регулярные выражения", создана пользователем Volt(220), 16 дек 2009.

  1. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Задача:
    Превратить строчку вида
    Код (Text):
    1. Рубрика/Первая:подрубрика/Тоже, рубрика
    в
    Код (Text):
    1. |Рубрика| |Первая| |подрубрика| |Тоже| |рубрика|
    Вопрос: как?

    Наработки:
    1)Все найти и обрамить.
    PHP:
    1. <?php
    2. $subj='Рубрика/Первая подрубрика/Тоже, рубрика';
    3. $pattern="#([А-Яа-я0-9]+)#u";
    4. preg_match_all($pattern, $subj, $matches);
    5. $rez="|".implode('| |',$matches[1])."|";
    Но хочется сделать одной строчкой.
    2)Обрамить слова, остальное убрать.
    PHP:
    1. <?php
    2. $subj='Рубрика/Первая подрубрика/Тоже, рубрика';
    3. $pattern="#.*?([А-Яа-я0-9]+).*?#u";
    4. $rep=" |$1| ";
    5. $rez=preg_replace($pattern, $rep, $subj);
    Получаются сдвоенные пробелы между словам.
     
  2. Dima4321

    Dima4321 Активный пользователь

    С нами с:
    1 апр 2009
    Сообщения:
    683
    Симпатии:
    0
    PHP:
    1. <?php
    2. ini_set('display_errors',1);
    3.  
    4. setlocale(LC_ALL, 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russia.1251');
    5.  
    6. $m='Рубрика/Первая:подрубрика/Тоже, рубрика';
    7.  
    8. $poisk='/([а-я].*)(\/|:|,|$)/siU';
    9.  
    10. preg_match_all($poisk,$m,$matches);
    11.  
    12.  
    13.  
    14. echo '|';
    15. echo $matches[1][0];
    16. echo '|';
    17. echo ' |';
    18. echo $matches[1][1];
    19. echo '|';
    20. echo ' |';
    21. echo $matches[1][2];
    22. echo '|';
    23. echo ' |';
    24. echo $matches[1][3];
    25. echo '|';
    26. echo ' |';
    27. echo $matches[1][4];
    28. echo '|';
    29.  
    30. ?>
     
  3. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    1)Строка "Рубрика/Первая:подрубрика/Тоже, рубрика" взята для примера. Может быть больше слов, может быть меньше.
    2)По сути это первый из предложенных мною вариантов.
     
  4. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    во втором варианте сделай $rep="|$1| "; - в конце будет один лишний пробел
    или $rep=" |$1|"; - лишний пробел будет в начале :)
     
  5. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Который спокойно убирается через trim.
    Точно.

    PS:
    Только этот модуль уже пол года как не используется. =)))
     
  6. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    Volt(220)
    главное - это ИДЕЯ! :-D
     
  7. Dima4321

    Dima4321 Активный пользователь

    С нами с:
    1 апр 2009
    Сообщения:
    683
    Симпатии:
    0
    Вот универсальный вариант с учетом разграничивания слов слешем -запятой-точкой дефисом-пробелом
    Лови ! )

    Код (Text):
    1. <?php
    2. ini_set('display_errors',1);
    3. error_reporting(E_ALL);
    4.  
    5. setlocale(LC_ALL, 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russia.1251');
    6.  
    7. $m='Рубрика/Первая:подрубрика/Тоже, рубрика';
    8.  
    9. $poisk='/([а-я]+)[-\/:,\.\s]*/si';
    10.  
    11. preg_match_all($poisk,$m,$matches);
    12.  
    13. $keywords = preg_split("/[\s\/:,\.]+/", $m );
    14. $count=count($keywords);
    15.    
    16.  
    17. $new=preg_match_all($poisk,$m,$matches);
    18.  
    19. $i=0;
    20.  while($i<$count) //
    21.  
    22. {
    23. echo '|';
    24. echo $matches[1][$i];
    25. echo '|';
    26. echo "&nbsp";
    27. $i++;
    28. }
    29.  
    30.  
    31. ?>