Довольно нубский вопрос , но всё же предположим срока имеет вид Код (Text): $str = "jca4EfСЛОВОфлрмф32СЛОВО2рУАВрииСЛОВО3wsfs" ; preg_match_all'ом нужно собрать все эти слова по порядку справа налево Мы изначально знаем , что за слова в строке могут быть. Я что то химичил , у меня даже получалось собирать их количество регуляркой типа (слово|слово2|слово3) , но массив $matches был пуст(да я не настолько дурак , указал его в параметрах) . Потом вообще всё перестало что либо делать и скрипт начал указывать на то, что у меня нету точку с запятой в строке с регулярным выражением \/. Вообщем нужна регулярка , а то я настолько запутался , что теперь и не знаю как быть....
что за слова и по какому принципу я буду их выделять из всего прочего набора букв, если нужно отделить текст от HTML тегов - нет проблем, если нужно отделить слова от цифр - нет проблем, а в твоем то случае что от чего?
Код (PHP): $str = "jca4EfСЛОВО1флрмф32СЛОВО2рУАВрииСЛОВО3wsfs" ; $data = array(); preg_match_all( '/(СЛОВО1|СЛОВО2|СЛОВО3)/ius', $str, $data); $result = array_reverse( $data[1] ); PS слово "СЛОВО" было заменено на "СЛОВО1", а иначе не пахало. если что то не то - какое объяснение такое и решение.
Примерно так же у меня работало раньше. Только вот та же фигня , массив пуст. А мне нужны эти данные... По моему это preg_match_all виноват , так как если использовать preg_match почему то в массив попадает таки совпадение , правда только первое. Хотелось бы ещё справа налево поиск осуществлять, гугл говорит про флаг , но при его установке опять массив пуст...
Не знаю, у меня массив не пуст, а метод array_reverse разворачивает все найденное, и что было последним тот станет первым, ну или как говорили коммунисты, кто был ни кем, тот станет всем. видимо те слова, что вы ищете, в них присутствуют символов которые необходимо экранировать, вот в чем косяк. http://php-include.ru/regulyarnye-vyrazheniya-onlain вот такой штука в помощь.
Не я эксперементировал именно с вашим примером . Слова состоят чисто из букв не более. Добавлено спустя 2 минуты 46 секунд: Ладно , спасибо и на этом.
может я конечно не совсем понял суть задачи.... но вот.... Код (Text): $str = "jca4EfСЛОВОфлрмф32СЛОВО2рУАВрииСЛОВО3wsfs" ; $arr = array('СЛОВО', 'СЛОВО3', 'СЛОВО2'); $ok = array(); foreach($arr as $word) { if(($pos = stripos($str, $word))!==false) $ok[$pos] = $word; } ksort($ok); print_r(array_reverse($ok, true));
не , слишком круто , у меня и так это обрабатывается внутри foreach по 200 раз в час. Вообщем вариант с array_reverse от VLK более чем годен , так как флаг на обратный поиск не работает. Добавлено спустя 25 минут 33 секунды: Воттаквот наванговали мен тут экранируемые символы и как раз в конце слова точка Да это файл. Что сюда докинуть надо и куда ? Код (Text): /(СЛОВО1|СЛОВО2|СЛОВО3)/ius P.S. точка в значениях массива не нужна.
Код (Text): '/(СЛОВО1|СЛОВО2|СЛОВО3)\./ius' // или '/(СЛОВО1\.|СЛОВО2\.|СЛОВО3\.)/ius' // но лучше первый вариант т.к. он короче только уже надо первый элемент массива, т.е.: Код (Text): $result = array_reverse( $data[0] ); в полном виде: Код (PHP): $str = "jca4EfСЛОВО1.флрмф32СЛОВО2.рУАВрииСЛОВО3.wsfs" ; $data = array(); preg_match_all( '/(СЛОВО1|СЛОВО2|СЛОВО3)\./ius', $str, $data); $result = array_reverse( $data[0] );
Да , работает . Ещё бы она не утаскивала в массив к значению точку, было бы вообще шикарно. Конечно её можно вырезать после, но мне интересно можно реализовать это внутри этого же регулярного выражения ?
С каждым новым сообщением открываются все новые подробности, а уже даже боюсь отвечать, используй это: Код (Text): '/(СЛОВО1|СЛОВО2|СЛОВО3)\./ius' и где ресивер (с 0 на 1 поменять надо): Код (PHP): $result = array_reverse( $data[1] );