Всем привет, столкнулся с проблемой. Вобще не шарю в регулярных выражениях, поэтому прошу помощи. есть текст : text text text text text text word(1,2,'1cc287b',3); text text text text word(4,5,'1cc2557b',6); text text Вот мне нужно вытащить в массив все значения выделенные красным цветом. Думаю это регулярными выражениями делается, но как не знаю. Прошу у вас помощи. Заранее спасибо.
При чересстрочном представлении данных и условии известности, в какой именно строке это содержится, можно обойтись только логикой, без регулярных выражений. А делается это просто: PHP: <?php // Построчное чтение файла или данных, как я полагаю $text[] = "text text text text text text"; $text[] = "word(1,2,'1cc287b',3);"; $text[] = "text text text text"; $text[] = "word(4,5,'1cc2557b',6);"; $text[] = "text text"; /** * Обрабатываем ... */ // Помещаем сюда результат $result = array(); // Обработка строк while(list($line, $str) = each($text)) { if(($line % 2)) { $part = substr($str, 5); $result[] = explode(',', substr($part, 0, strlen($part) - 2)); } } // Смотрим результат echo '<pre>' . print_r($result, true); ?>
спасибо конечно, но проблема еще в том что не известно в каких строках это содержится, и там мало что известно, ибо я беру из HTML код. Наверно надо было сначало это сказать, просто думал разницы не будет. Известно лишь "шаблон" word(число,число,'число-буква', число); может быть и так и текст менятся может: Код (Text): text <br><b>text </b> text text text text word(1,2[,'1cc287b',3); text text text text word(4,5,'1cc25g57b',6); text <script> fdfsdf fd </script> text <hr> Извиняюсь) Заранее спасибо.
PHP: <?php $text = "text <br><b>text </b> text text text text word(1,2[,'1cc287b',3); text text text text word(4,5,'1cc25g57b',6); text <script> fdfsdf fd </script> text <hr>"; if(preg_match_all('/^[a-z0-9_]+\((.+?)\);/mi', $text, $funcs)) { // Смотрим результат echo '<pre>' . print_r($funcs, true); } ?>
PHP: <?php $text = "text <br><b>text </b> text text text text word(1,2,'1cc287b',3); text text text text word(4,5,'1cc25g57b',6); text <script> fdfsdf fd </script> text <hr>"; if(preg_match_all('/word\(\d+,\d+,\'\w+\',\d+\);/mi', $text, $match)) { // Смотрим результат echo '<pre>',print_r($match),'</pre>'; }else echo 'wrong'; ?>
Я не даю нерабочих примеров и лично каждый провераю сам, за исключением случаев, когда явно указываю, что написано на форуме и может содержать опечатки. В данном случае, я так полагаю, проблема связана с тем, что человек скопировал текст вместе с теми пробелами, который вставляет форум перед кодом на каждой строке, а в регулярном выражении указан ^, который обозначает начало строки и следующие за ним символы, у нас же следует пробел. Это сугубо особенность форума и к работоспособности кода не имеет абсолютно никакого отношения. Код рабочий на все 100%, можете у себя проверить.
еще раз здравствуйте! вы уж меня извините, но в регулярных выражениях я действительно не шарю. Шаблон: <b id="text123">text1 текст 23*/2)</b> - <span id="text321">text текст=-0-8)9*</span> Теперь задачка в том, чтобы взять в массив значиния отмеченные красным, при том что значения отмеченые зеленым могут менятся. Надеюсь это выполнимо. Заранее спасибо! :roll:
не, вобще HTML код большой но в нем присутсвуют такие "шаблоны" и красные значения надо засунуть в массив. Например : Код (Text): <b id="text123">text1 текст 23*/2)</b> - <span id="text321">text текст=-0-8)9*</span> <hr> <table><tr><td> <b id="text123">text1 текст 23*/2)</b> - <span id="text321">text текст=-0-8)9*</span> </td></tr></table> <b id="text123">text1 текст 23*/2)</b> - <span id="text321">text текст=-0-8)9*</span> Да, так точнее скорее всего =)
pokemon-zloi уже хлеб - вопрос по поводу тегов (только b и span ?) - остался открытым Код (Text): /<(b|span).*id=(?:'|\")text\d+(?:'|\").*>(.*)<\/\\1>/ismU
Эммм ... а почему в вашем коде указан модификатор s и m в одном регулярном выражении? Это же взаимоисключающие вещи, указывающие на разные режимы работы ... мм? И жадность у * не указана ... он же схавает всё до последнего
про жадность надо подумать ... вполне возможно что и надо её инвертировать а вот s и m я так понял что : s - метасимвол точка становится мультистрочной m - ^$ соответсвуют началу и концу строки соответсвенно. А не началу и концу данных как без него (то есть среда применения у них разная ...) и да здесь m ненужен ибо нету ^$
Я предпочитаю явно указывать квантификатор ?, вместо модификатора u инвертирования (не U). Режим работы с "s" такой, что ^ и $ соответствуют началу и концу ТЕКСТА, но не одной строки. Т.е при "m" каждый символ переноса строки будет означать $ (конец строки). В таком режиме работы существуют дополнительные "указатели" именно на начало и конец ТЕКСТА, т.е они начинают работать в этом режиме.
Код (Text): <b id="text123">text1 текст 23*/2)</b> - <span id="othertext321">text текст=-0-8)9*</span> text123 и othertext321 забыл сказать что там разные тексты( поэтому поэтому не работает(
Код (Text): /<(b|span)[^>]*id=(?:'|")text\d+(?:'|")[^.]*>([^<]*)<\/\\1>/isU - и нежадность вроде как ненужна где это описанно ? я нашел только: