За последние 24 часа нас посетили 17093 программиста и 1835 роботов. Сейчас ищут 1711 программистов ...

Нужна регулярка

Тема в разделе "Регулярные выражения", создана пользователем RainBowDash, 31 июл 2014.

  1. RainBowDash

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

    С нами с:
    22 июл 2013
    Сообщения:
    220
    Симпатии:
    8
    Довольно нубский вопрос , но всё же

    предположим срока имеет вид
    Код (Text):
    1. $str = "jca4EfСЛОВОфлрмф32СЛОВО2рУАВрииСЛОВО3wsfs" ;
    preg_match_all'ом нужно собрать все эти слова по порядку справа налево
    Мы изначально знаем , что за слова в строке могут быть.
    Я что то химичил , у меня даже получалось собирать их количество регуляркой типа (слово|слово2|слово3) , но массив $matches был пуст(да я не настолько дурак , указал его в параметрах) .
    Потом вообще всё перестало что либо делать и скрипт начал указывать на то, что у меня нету точку с запятой в строке с регулярным выражением \o_O/. Вообщем нужна регулярка , а то я настолько запутался , что теперь и не знаю как быть....
     
  2. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    что за слова и по какому принципу я буду их выделять из всего прочего набора букв, если нужно отделить текст от HTML тегов - нет проблем, если нужно отделить слова от цифр - нет проблем, а в твоем то случае что от чего?
     
  3. RainBowDash

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

    С нами с:
    22 июл 2013
    Сообщения:
    220
    Симпатии:
    8
    Нужно найти конкретные слова в наборе символов. Слова изначально известны. Ни коем не HTML
     
  4. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Код (PHP):
    1. $str = "jca4EfСЛОВО1флрмф32СЛОВО2рУАВрииСЛОВО3wsfs" ;
    2.  
    3. $data = array();
    4. preg_match_all( '/(СЛОВО1|СЛОВО2|СЛОВО3)/ius', $str, $data);
    5.  
    6. $result = array_reverse( $data[1] );
    PS слово "СЛОВО" было заменено на "СЛОВО1", а иначе не пахало.
    если что то не то - какое объяснение такое и решение.
     
  5. RainBowDash

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

    С нами с:
    22 июл 2013
    Сообщения:
    220
    Симпатии:
    8
    Примерно так же у меня работало раньше. Только вот та же фигня , массив пуст. А мне нужны эти данные...

    По моему это preg_match_all виноват , так как если использовать preg_match почему то в массив попадает таки совпадение , правда только первое. Хотелось бы ещё справа налево поиск осуществлять, гугл говорит про флаг , но при его установке опять массив пуст...
     
  6. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Не знаю, у меня массив не пуст, а метод array_reverse разворачивает все найденное, и что было последним тот станет первым, ну или как говорили коммунисты, кто был ни кем, тот станет всем.

    видимо те слова, что вы ищете, в них присутствуют символов которые необходимо экранировать, вот в чем косяк.

    http://php-include.ru/regulyarnye-vyrazheniya-onlain
    вот такой штука в помощь.
     
  7. RainBowDash

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

    С нами с:
    22 июл 2013
    Сообщения:
    220
    Симпатии:
    8
    Не я эксперементировал именно с вашим примером .
    Слова состоят чисто из букв не более.

    Добавлено спустя 2 минуты 46 секунд:
    Ладно , спасибо и на этом.
     
  8. s.melukov

    s.melukov Новичок

    С нами с:
    31 июл 2014
    Сообщения:
    78
    Симпатии:
    0
    может я конечно не совсем понял суть задачи.... но вот....
    Код (Text):
    1. $str = "jca4EfСЛОВОфлрмф32СЛОВО2рУАВрииСЛОВО3wsfs" ;
    2. $arr = array('СЛОВО', 'СЛОВО3', 'СЛОВО2');
    3. $ok = array();
    4. foreach($arr as $word)
    5. {
    6.     if(($pos = stripos($str, $word))!==false)
    7.         $ok[$pos] = $word;
    8. }
    9. ksort($ok);
    10. print_r(array_reverse($ok, true));
     
  9. RainBowDash

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

    С нами с:
    22 июл 2013
    Сообщения:
    220
    Симпатии:
    8
    не , слишком круто , у меня и так это обрабатывается внутри foreach по 200 раз в час.
    Вообщем вариант с array_reverse от VLK более чем годен , так как флаг на обратный поиск не работает.

    Добавлено спустя 25 минут 33 секунды:
    Воттаквот наванговали мен тут экранируемые символы и как раз в конце слова точка :D Да это файл.
    Что сюда докинуть надо и куда ?
    Код (Text):
    1. /(СЛОВО1|СЛОВО2|СЛОВО3)/ius
    P.S. точка в значениях массива не нужна.
     
  10. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Код (Text):
    1. '/(СЛОВО1|СЛОВО2|СЛОВО3)\./ius'
    2. // или
    3. '/(СЛОВО1\.|СЛОВО2\.|СЛОВО3\.)/ius'
    4. // но лучше первый вариант т.к. он короче
    только уже надо первый элемент массива, т.е.:
    Код (Text):
    1. $result = array_reverse( $data[0] );
    в полном виде:
    Код (PHP):
    1. $str = "jca4EfСЛОВО1.флрмф32СЛОВО2.рУАВрииСЛОВО3.wsfs" ;
    2.  
    3. $data = array();
    4. preg_match_all( '/(СЛОВО1|СЛОВО2|СЛОВО3)\./ius', $str, $data);
    5.  
    6. $result = array_reverse( $data[0] );
     
  11. RainBowDash

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

    С нами с:
    22 июл 2013
    Сообщения:
    220
    Симпатии:
    8
    Да , работает .
    Ещё бы она не утаскивала в массив к значению точку, было бы вообще шикарно. Конечно её можно вырезать после, но мне интересно можно реализовать это внутри этого же регулярного выражения ?
     
  12. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Уберите \. из регулярки
     
  13. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    С каждым новым сообщением открываются все новые подробности, а уже даже боюсь отвечать, используй это:
    Код (Text):
    1. '/(СЛОВО1|СЛОВО2|СЛОВО3)\./ius'
    и где ресивер (с 0 на 1 поменять надо):
    Код (PHP):
    1. $result = array_reverse( $data[1] );