На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ALXR
  
    > PHP: регулярные выражения , помогите новичку
      Привет всем !!!

      Начал изучать регулярные выражения и сразу же столкнулся с проблемой составления нужного мне выражения. Требуется подсказка :yes: Итак, мне нужно выделить текст, который находится внутри определённого набора символов. Например, мне нужно найти в документе все ссылки:
      ExpandedWrap disabled
        ...
        $s1 = "<a href=";
        $s2 = ">";
        $str = '<a href="http://www.mysite.net/script?searchtext=string&form_type=simple">My string</a>';
        ...

      Как мне выделить из $str ссылку, то есть текст находящийся между строками $s1 и $s2 ?
        PHP FAQ: Регулярные выражения.
        Там и далее имеются примеры готовых решений.

        Добавлено
        Цитата bur80 @
        Требуется подсказка
        Подсказка - это когда ты что-то сделал, но у тебя какой-то непонятный затык. Поэтому когда просишь подсказку - разумно демонстрировать свои попытки решить проблему.
          Я помню как я читал мануалы о регулярных выражениях и ничего немог понять. ;)

          Я привык работать с PERL compatible выражениями, т.к. они имеют больше возможностей и гораздо быстрее.
          В данном случае я бы сделал так:
          ExpandedWrap disabled
            $count_of_array = preg_match_all("/<a href=(.*)>/U","<a href=\"jkghsdj\"></a>", $ee, PREG_PATTERN_ORDER);
            echo $ee[1][0];

          Обясню как что работает! preg_match_all возвращяет все совпадения в массив $ee, PREG_PATTERN_ORDER - флаг, каторый озночает что $ee[0][$j] содерзчит полные совпадения, а $ee[1][$j] - совпадения первой подмаски (подмаска ето то что в регулиарном выражении в скобках - т.е. (.*)). знак .* означает все символы. А вообще почитай о регулярных выражениях тут, и о функциях в PHP, каторые работают с регулярными выражениями (тут)
            Цитата SiMM @
            PHP FAQ: Регулярные выражения.
            Там и далее имеются примеры готовых решений.

            Добавлено
            Цитата bur80 @
            Требуется подсказка
            Подсказка - это когда ты что-то сделал, но у тебя какой-то непонятный затык. Поэтому когда просишь подсказку - разумно демонстрировать свои попытки решить проблему.

            Изучаю документацию, будут вопросы - задам в этой ветке. :rolleyes:
              Документации, как всегда, море :wacko: Помогите составить регулярку. Скажем, есть строка "мы делили апельсин, много наших полегло". Мне нужно вывести слово, в котором содержиться строка апел, то есть в результате я должен получить слово апельсин. Как ? :wall:

              Добавлено
              Edva, не совсем удачный для меня пример :( Мне нужны примеры поиска позиции начала/конца определённого слова в строке и т.п. ;)
                Цитата bur80 @
                Документации, как всегда, море Помогите составить регулярку. Скажем, есть строка "мы делили апельсин, много наших полегло". Мне нужно вывести слово, в котором содержиться строка апел, то есть в результате я должен получить слово апельсин. Как ?

                ExpandedWrap disabled
                  <?
                  $s = "мы делили апельсин, много наших полегло";
                  preg_match("/(апел[^\W]+)/i", $s, $matches);
                  echo $matches[1];
                  ?>

                Так?
                  Цитата bur80 @
                  Мне нужны примеры поиска позиции начала/конца определённого слова в строке и т.п.

                  т.е. тибе нужен номер позиции начала и конца?
                    Цитата
                    т.е. тибе нужен номер позиции начала и конца?

                    И это тоже :yes: Вообще, неплохо было бы иметь готовые примеры решения различных, наиболее типичных, задач. Ну, для самообучения естественно. :whistle:

                    Добавлено
                    Цитата Mastilior @
                    Цитата bur80 @
                    Документации, как всегда, море Помогите составить регулярку. Скажем, есть строка "мы делили апельсин, много наших полегло". Мне нужно вывести слово, в котором содержиться строка апел, то есть в результате я должен получить слово апельсин. Как ?

                    ExpandedWrap disabled
                      <?
                      $s = "мы делили апельсин, много наших полегло";
                      preg_match("/(апел[^\W]+)/i", $s, $matches);
                      echo $matches[1];
                      ?>

                    Так?

                    Да, спасибо :yes:
                      Цитата

                      примеры поиска позиции начала/конца определённого слова в строке
                      почитай про
                      \b - соответствует границе слова(то есть точке между символом слова и символом не входящим в состав слова)
                      \B - соответствует позиции, которая не явл. границей слова
                      может тебе это облегчит задачу...
                        Дж. Фридл, Регулярные выражения, библиотека программиста, 2е издание, Изд. Питер, 2003
                        http://unix.onanizm.ru/misc/regexp.djvu
                          Цитата SiMM @
                          Дж. Фридл, Регулярные выражения, библиотека программиста, 2е издание, Изд. Питер, 2003
                          http://unix.onanizm.ru/misc/regexp.djvu

                          Скачал, а что это за формат такой djvu ? Открыть бы теперь :)
                            Читалку можно взять, например, здесь
                            DjVuWebBrowserPlugin_EN.exe - плагин к IE.
                            DjVuSolo3.1-noncom.exe - отдельное приложение.
                              Чтобы найти слово содержащее некоторый символ мы используем такую комбинацию:
                              Цитата
                              "/(апел[^\W]+)/i"
                              , а что если мне нужно задать ещё одно условие, как в этом случае будет выглядеть выражение ?

                              Добавлено
                              Ещё мне требуется наиболее полная таблица метасимволов, которые используются в регулярных выражениях :rolleyes:

                              Добавлено
                              SiMM, спасибо за ссылки 8-)
                                Цитата bur80 @
                                а что если мне нужно задать ещё одно условие
                                Какое?
                                Цитата bur80 @
                                Ещё мне требуется наиболее полная таблица метасимволов, которые используются в регулярных выражениях

                                PHP Manual: Регулярные выражения в деталях - Метасимволы
                                  Цитата
                                  Какое?

                                  Мне нужно сделать что-то типа:
                                  Цитата
                                  /условие1/и/условие2/

                                  Иными словами, как задать 2 условия в одном выражении и каким символом они должны быть разделены ? :huh:
                                    bur80, пример приведи. Потому что для "и", как я его понимаю, ничего делать не нужно.
                                      Цитата SiMM @
                                      bur80, пример приведи. Потому что для "и", как я его понимаю, ничего делать не нужно.

                                      Ну, например, если мне нужно найти наличие некоей последовательности символов, то я могу сделать так:
                                      Цитата
                                      /abc/i

                                      Если мне нужно найти слово, содержащее определённую последовательность символов, то я делаю так:
                                      Цитата
                                      /апел(^[\W]+)/i

                                      Как мне найти то, что содержиться между двумя разными последовательностями символов ? Понимаю, что вопрос тривиальный, но не могу найти удачный пример, чтобы понять как работает механизм регулярных выражений :(
                                      Итак, я знаю как найти одну последовательность символов, а как найти наличие двух разных последовательностей ? Ну, например, abc и qwe ? :wacko:
                                        /abc(.*?)qwe/s
                                        Ты это имел в виду? В 1м "кармане" будет то, что тебе нужно.
                                          Цитата SiMM @
                                          /abc(.*?)qwe/s
                                          Ты это имел в виду? В 1м "кармане" будет то, что тебе нужно.

                                          Да, это :yes: А чем 1-й карман от второго отличается и от нулевого ? :huh:
                                            Цитата bur80 @
                                            А чем 1-й карман от второго отличается и от нулевого ?
                                            Номером ;)
                                            Нулевой карман - это всё, что вошло в регулярник. Остальные карманы нумеруются от единицы (первая парная скобка - первый карман, вторая - второй и т.д.). Это если забыть о существовании (?:...)
                                              Цитата SiMM @
                                              Цитата bur80 @
                                              А чем 1-й карман от второго отличается и от нулевого ?
                                              Номером ;)
                                              Нулевой карман - это всё, что вошло в регулярник. Остальные карманы нумеруются от единицы (первая парная скобка - первый карман, вторая - второй и т.д.). Это если забыть о существовании (?:...)

                                              Насколько я понял, в массив выводятся результаты регулярного выражения, так вот не пойму по какому принципу ? :huh: Вроде как результат регулярного выражения один или как ? :wacko:
                                                Цитата bur80 @
                                                Насколько я понял, в массив выводятся результаты регулярного выражения, так вот не пойму по какому принципу ?
                                                preg_match_all
                                                  Цитата bur80 @
                                                  Привет всем !!!

                                                  Начал изучать регулярные выражения и сразу же столкнулся с проблемой составления нужного мне выражения. Требуется подсказка :yes: Итак, мне нужно выделить текст, который находится внутри определённого набора символов. Например, мне нужно найти в документе все ссылки:
                                                  ExpandedWrap disabled
                                                    ...
                                                    $s1 = "<a href=";
                                                    $s2 = ">";
                                                    $str = '<a href="http://www.mysite.net/script?searchtext=string&form_type=simple">My string</a>';
                                                    ...

                                                  Как мне выделить из $str ссылку, то есть текст находящийся между строками $s1 и $s2 ?

                                                  ExpandedWrap disabled
                                                    <?php
                                                    $str = '<a href="http://www.mysite.net/script?searchtext=string&form_type=simple">My string</a>';
                                                    $link = explode("<a href=\"", $str);
                                                    $link2 = explode("</a>", $link[1]);
                                                    $link3 = explode("\">", $link2[0]);
                                                    print "$link3[0]<br>";
                                                    ?>

                                                  Так как ты хотел.
                                                  Сообщение отредактировано: link -
                                                    link, эта тема про регулярки ! :rolleyes:
                                                      Понятно, просто проще через explode ну пох.
                                                        Если нужно найти нечто внутри границ, не включая самих границ, смотри в сторону look ahead и look behind assertions.
                                                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                        0 пользователей:


                                                        Рейтинг@Mail.ru
                                                        [ Script execution time: 0,0724 ]   [ 15 queries used ]   [ Generated: 7.05.24, 21:09 GMT ]