За последние 24 часа нас посетили 15804 программиста и 1666 роботов. Сейчас ищут 858 программистов ...

Рег. Выражения

Тема в разделе "Регулярные выражения", создана пользователем pokemon-zloi, 6 окт 2009.

  1. pokemon-zloi

    pokemon-zloi Активный пользователь

    С нами с:
    6 окт 2009
    Сообщения:
    15
    Симпатии:
    0
    Всем привет, столкнулся с проблемой. Вобще не шарю в регулярных выражениях, поэтому прошу помощи.

    есть текст :
    text text text text text text
    word(1,2,'1cc287b',3);
    text text text text
    word(4,5,'1cc2557b',6);
    text text

    Вот мне нужно вытащить в массив все значения выделенные красным цветом.

    Думаю это регулярными выражениями делается, но как не знаю. Прошу у вас помощи. Заранее спасибо.
     
  2. karakh

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

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    то есть тебе нужны все что в кавычках плюс все цифры?
     
  3. pokemon-zloi

    pokemon-zloi Активный пользователь

    С нами с:
    6 окт 2009
    Сообщения:
    15
    Симпатии:
    0
    да, только не все цифры и то что в ковычках во всем тексте, а в "функциях" word
     
  4. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    При чересстрочном представлении данных и условии известности, в какой именно строке это содержится, можно обойтись только логикой, без регулярных выражений.
    А делается это просто:

    PHP:
    1. <?php
    2.  
    3. // Построчное чтение файла или данных, как я полагаю
    4. $text[] = "text text text text text text";
    5. $text[] = "word(1,2,'1cc287b',3);";
    6. $text[] = "text text text text";
    7. $text[] = "word(4,5,'1cc2557b',6);";
    8. $text[] = "text text";
    9.  
    10. /**
    11.  * Обрабатываем ...
    12.  */
    13.  
    14. // Помещаем сюда результат
    15. $result = array();
    16.  
    17. // Обработка строк
    18. while(list($line, $str) = each($text)) {
    19.     if(($line % 2)) {
    20.         $part = substr($str, 5);
    21.         $result[] = explode(',', substr($part, 0, strlen($part) - 2));
    22.     }
    23. }
    24.  
    25. // Смотрим результат
    26. echo '<pre>' . print_r($result, true);
    27.  
    28. ?>
     
  5. pokemon-zloi

    pokemon-zloi Активный пользователь

    С нами с:
    6 окт 2009
    Сообщения:
    15
    Симпатии:
    0
    спасибо конечно, но проблема еще в том что не известно в каких строках это содержится, и там мало что известно, ибо я беру из HTML код. Наверно надо было сначало это сказать, просто думал разницы не будет.
    Известно лишь "шаблон" word(число,число,'число-буква', число);
    может быть и так и текст менятся может:
    Код (Text):
    1.  
    2. text <br><b>text
    3. </b> text text text text
    4. word(1,2[,'1cc287b',3);
    5. text text text text
    6. word(4,5,'1cc25g57b',6);
    7. text
    8. <script>
    9. fdfsdf fd
    10. </script>
    11. text <hr>
    Извиняюсь)
    Заранее спасибо.
     
  6. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    PHP:
    1. <?php
    2.  
    3. $text = "text <br><b>text
    4. </b> text text text text
    5. word(1,2[,'1cc287b',3);
    6. text text text text
    7. word(4,5,'1cc25g57b',6);
    8. text
    9. <script>
    10. fdfsdf fd
    11. </script>
    12. text <hr>";
    13.  
    14.  
    15. if(preg_match_all('/^[a-z0-9_]+\((.+?)\);/mi', $text, $funcs)) {
    16.     // Смотрим результат
    17.     echo '<pre>' . print_r($funcs, true);
    18. }
    19.  
    20.  
    21. ?>
     
  7. pokemon-zloi

    pokemon-zloi Активный пользователь

    С нами с:
    6 окт 2009
    Сообщения:
    15
    Симпатии:
    0
    тупо скопировал в новую страницу, сохранил, открыл через апач, и ничего не показывает(
     
  8. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    PHP-то хоть установлен О.о
     
  9. nimistar

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

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    Apple - а сам то проверял ? ... если регулярка ошибочна то пусто и будет
     
  10. nimistar

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

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    PHP:
    1.  
    2. <?php
    3.  
    4.   $text = "text <br><b>text
    5.  </b> text text text text
    6.  word(1,2,'1cc287b',3);
    7.  text text text text
    8.  word(4,5,'1cc25g57b',6);
    9.  text
    10.  <script>
    11.  fdfsdf fd
    12.  </script>
    13.  text <hr>";
    14.  
    15.  
    16.   if(preg_match_all('/word\(\d+,\d+,\'\w+\',\d+\);/mi', $text, $match)) {
    17.       // Смотрим результат
    18.       echo '<pre>',print_r($match),'</pre>';
    19.   }else echo 'wrong';
    20.  
    21.  
    22. ?>
     
  11. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Я не даю нерабочих примеров и лично каждый провераю сам, за исключением случаев, когда явно указываю, что написано на форуме и может содержать опечатки.
    В данном случае, я так полагаю, проблема связана с тем, что человек скопировал текст вместе с теми пробелами, который вставляет форум перед кодом на каждой строке, а в регулярном выражении указан ^, который обозначает начало строки и следующие за ним символы, у нас же следует пробел.
    Это сугубо особенность форума и к работоспособности кода не имеет абсолютно никакого отношения.
    Код рабочий на все 100%, можете у себя проверить.
     
  12. pokemon-zloi

    pokemon-zloi Активный пользователь

    С нами с:
    6 окт 2009
    Сообщения:
    15
    Симпатии:
    0
    конечно установлен)
     
  13. nimistar

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

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    Apple - мдя .. точно .. привязка регулярки то к началу строки ...
     
  14. pokemon-zloi

    pokemon-zloi Активный пользователь

    С нами с:
    6 окт 2009
    Сообщения:
    15
    Симпатии:
    0
    Apple заработало с вашим примером нормально когда убрал символ ^
    спасибо всем!)
     
  15. pokemon-zloi

    pokemon-zloi Активный пользователь

    С нами с:
    6 окт 2009
    Сообщения:
    15
    Симпатии:
    0
    еще раз здравствуйте! вы уж меня извините, но в регулярных выражениях я действительно не шарю.
    Шаблон:
    • <b id="text123">text1 текст 23*/2)</b> - <span id="text321">text текст=-0-8)9*</span>
    Теперь задачка в том, чтобы взять в массив значиния отмеченные красным, при том что значения отмеченые зеленым могут менятся.
    Надеюсь это выполнимо.
    Заранее спасибо! :roll:
     
  16. nimistar

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

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    <b и <span - только эти теги ?
    id="text123" - может так точнее ?
     
  17. pokemon-zloi

    pokemon-zloi Активный пользователь

    С нами с:
    6 окт 2009
    Сообщения:
    15
    Симпатии:
    0
    не, вобще HTML код большой но в нем присутсвуют такие "шаблоны" и красные значения надо засунуть в массив.
    Например :
    Код (Text):
    1.  
    2. <b id="text123">text1 текст 23*/2)</b> - <span id="text321">text текст=-0-8)9*</span>
    3. <hr>
    4. <table><tr><td>
    5. <b id="text123">text1 текст 23*/2)</b> - <span id="text321">text текст=-0-8)9*</span>
    6. </td></tr></table>
    7. <b id="text123">text1 текст 23*/2)</b> - <span id="text321">text текст=-0-8)9*</span>
    Да, так точнее скорее всего =)
     
  18. nimistar

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

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    pokemon-zloi уже хлеб - вопрос по поводу тегов
    (только b и span ?) - остался открытым


    Код (Text):
    1. /<(b|span).*id=(?:'|\")text\d+(?:'|\").*>(.*)<\/\\1>/ismU
     
  19. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Эммм ... а почему в вашем коде указан модификатор s и m в одном регулярном выражении?
    Это же взаимоисключающие вещи, указывающие на разные режимы работы ... мм?
    И жадность у * не указана ... он же схавает всё до последнего
     
  20. pokemon-zloi

    pokemon-zloi Активный пользователь

    С нами с:
    6 окт 2009
    Сообщения:
    15
    Симпатии:
    0
    Ну, да) все как я показал)
     
  21. nimistar

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

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    про жадность надо подумать ... вполне возможно что и надо её инвертировать

    а вот s и m
    я так понял что :
    s - метасимвол точка становится мультистрочной
    m - ^$ соответсвуют началу и концу строки соответсвенно. А не началу и концу данных как без него
    (то есть среда применения у них разная ...)
    и да здесь m ненужен ибо нету ^$
     
  22. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Я предпочитаю явно указывать квантификатор ?, вместо модификатора u инвертирования (не U).

    Режим работы с "s" такой, что ^ и $ соответствуют началу и концу ТЕКСТА, но не одной строки.
    Т.е при "m" каждый символ переноса строки будет означать $ (конец строки). В таком режиме работы существуют дополнительные "указатели" именно на начало и конец ТЕКСТА, т.е они начинают работать в этом режиме.
     
  23. pokemon-zloi

    pokemon-zloi Активный пользователь

    С нами с:
    6 окт 2009
    Сообщения:
    15
    Симпатии:
    0
    Код (Text):
    1.  
    2. <b id="text123">text1 текст 23*/2)</b> - <span id="othertext321">text текст=-0-8)9*</span>
    text123 и othertext321 забыл сказать что там разные тексты( поэтому

    поэтому не работает(
     
  24. nimistar

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

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    Код (Text):
    1. /<(b|span)[^>]*id=(?:'|")text\d+(?:'|")[^.]*>([^<]*)<\/\\1>/isU
    - и нежадность вроде как ненужна


    где это описанно ?
    я нашел только:

     
  25. nimistar

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

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    Код (Text):
    1. preg="/<(b|span)[^>]*id=(?:'|")(?:text|othertext)\d+(?:'|")[^>]*>([^<]*)<\/\\1>/isU";