Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP: Регулярные выражения (RegExp, Regular, eregi, preg)

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Открыть новую тему     Написать ответ в эту тему

Rendom



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Учебники регулярных выражений
 
Кто сможет составить выражение для такого случая:

Код:
 
<table border=0>
<tr>
   <td>blablablabla<table border=0><tr><td>blablabla_UNIQTEXT_blablabla</td></tr></table></td>
   <td><table border=1><tr><td>blablabla</td></tr></table>666666</td>
</tr
</table>
 

Нужно удалить из этого всего кусок "<table border=0><tr><td>blablabla_UNIQTEXT_blablabla</td></tr></table>". Иными словами нужно вырезать текст от "<table" до "</table>" внутри которого есть строка "UNIQTEXT", но при этом не удалить лишнего. В результате должно получиться:

Код:
 
<table border=0>
<tr>
   <td>blablablabla</td>
   <td><table border=1><tr><td>blablabla</td></tr></table>666666</td>
</tr
</table>
 

Всего записей: 115 | Зарегистр. 27-10-2002 | Отправлено: 23:26 17-05-2005 | Исправлено: AZJIO, 04:05 09-12-2014
Danil Lab



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Подскажите как удалить с помощью рег. выражений: начиная от .zip до конца
Те преобразовать из
aaaaa.zip21954656
к
aaaaa
Изменяется все кроме .zip

Всего записей: 269 | Зарегистр. 12-06-2005 | Отправлено: 13:31 09-01-2006
Brodyaga



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
<?php
function magic($src_str){
list($needle,$dumb)=split("\.",$src_str);
return $needle;
}
?>
Вернет строку aaaaa
Если задача именно такова, то регулярных выражений не требуется.


----------
Damn Metal

Всего записей: 2713 | Зарегистр. 07-01-2006 | Отправлено: 14:38 09-01-2006
Cacka



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите пожалуйста, как мне решить вот такую задачу :
 
есть строка вида :

Код:
<!--QuoteBegin-->                <table  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"90%\" align=\"center\">                  <tr>                    <td class=\"vbquote\">                    <table  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">                      <tr>                        <td class=\"vbquote\" width=\"75\" valign=\"bottom\">                        <table  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"50px\">                          <tr>                            <td class=\"vbquote\" width=\"28\" valign=\"top\"><img src=\"style_images/1/quotes/quot-top-left.gif\" alt=\"\" /></td>                            <td class=\"vbquote\" width=\"100%\" style=\"background-image: url(\'style_images/1/quotes/quote-bg.gif\'); background-position: center;\" valign=\"middle\"><span class=\"vbquote\">Цитата:</span></td>                            <td class=\"vbquote\" valign=\"top\"><img src=\"style_images/1/quotes/quot-top-right.gif\" alt=\"\" /></td>                          </tr>                        </table>                        </td>                        <td class=\"vbquote\" align=\"left\" style=\"background-image: url(\'style_images/1/quotes/quot-lr-bg.gif\')\" valign=\"bottom\"></td><td class=\"vbquote\" width=\"100%\" align=\"right\" valign=\"bottom\">                        <table  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">                          <tr>                            <td class=\"vbquote\" width=\"100%\">                            <table  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">                              <tr>                                <td class=\"vbquote\" style=\"background-image: url(\'style_images/1/quotes/quot-top-bg.gif\')\" width=\"100%\" valign=\"middle\"></td>                                <td class=\"vbquote\"  align=\"left\" valign=\"top\"><img src=\"style_images/1/quotes/quot-top-right-10.gif\" alt=\"\" /></td>                              </tr>                            </table>                            </td>                          </tr>                        </table>                        </td>                      </tr>                    </table>                    <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">                      <tr>                        <td class=\"vbquote\" width=\"10\" style=\"background-image: url(\'style_images/1/quotes/quoting-left.gif\')\"></td>                        <td class=\"vbquotemain\" width=\"100%\" valign=\"top\"></td>                        <td class=\"vbquote\" width=\"10\" style=\"background-image: url(\'style_images/1/quotes/quoting-right.gif\')\"></td>                      </tr>                      <tr>                        <td class=\"vbquote\" width=\"10\" style=\"background-image: url(\'style_images/1/quotes/quot-left-bg.gif\')\"></td>                        <td class=\"vbquotemain\" width=\"100%\" valign=\"top\"><!--QuoteEBegin-->ТУТ ЛЮБОЙ ТЕКСТ<!--QuoteEnd--></td>                        <td class=\"vbquote\" width=\"10\" style=\"background-image: url(\'style_images/1/quotes/quot-right-bg.gif\')\"></td>                      </tr>                      <tr>                        <td class=\"vbquote\" width=\"10\" valign=\"bottom\"><img src=\"style_images/1/quotes/quot-bot-left.gif\" alt=\"\" /></td>                        <td class=\"vbquote\" width=\"100%\" style=\"background-image: url(\'style_images/1/quotes/quot-bot-bg.gif\')\"></td>                        <td class=\"vbquote\" width=\"10\" valign=\"bottom\"><img src=\"style_images/1/quotes/quot-bot-right.gif\" alt=\"\" /></td>                      </tr>                    </table>                    </td>                  </tr>                </table><!--QuoteEEnd-->
 

 
мне надо превратить её в

Код:
<!--QuoteBegin--><div class=\'quotetop\'>Цитата</div><div class=\'quotemain\'><!--QuoteEBegin-->ТУТ ЛЮБОЙ ТЕКСТ<!--QuoteEnd--></div><!--QuoteEEnd--><br /><br />

 
Сказали, что с помощью регулярных выражений это можно сделать...Подскажите?

Всего записей: 115 | Зарегистр. 12-07-2005 | Отправлено: 20:11 16-02-2006
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cacka
$str="белиберда сверху";
$str=preg_replace('/<!--QuoteBegin-->.*?<!--QuoteEBegin-->(.*?)<!--QuoteEnd-->.*?<!--QuoteEEnd-->/im',"<!--QuoteBegin--><div class=\'quotetop\'>Цитата</div><div class=\'quotemain\'><!--QuoteEBegin-->$1<!--QuoteEnd--></div><!--QuoteEEnd--><br /><br />",$str);

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:31 16-02-2006 | Исправлено: Cheery, 20:51 16-02-2006
Cacka



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
$str="белиберда сверху";

 
что, вообще вся? или какая-то часть? или вся белиберда, кроме <!--QuoteBegin--> и прочего?

Всего записей: 115 | Зарегистр. 12-07-2005 | Отправлено: 20:46 16-02-2006
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cacka

Цитата:
что, вообще вся? или какая-то часть? или вся белиберда, кроме <!--QuoteBegin--> и прочего?

вся.

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:51 16-02-2006
Cacka



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
огромное спасибо! всё отлично сконвертилось

Всего записей: 115 | Зарегистр. 12-07-2005 | Отправлено: 22:35 16-02-2006
ssmsexe



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
есть blabalbala?&!=tratatatratata=#!blablabla  
как выдернуть "tratatatratata" т.е. то что находится между ?&!= =#!  
tratatatratata не является постоянным вырожением.  
впрочем как и blabalba  
постоянны только ?&!= =#!.

Всего записей: 17 | Зарегистр. 18-03-2006 | Отправлено: 21:45 25-08-2006
Kokoc

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ssmsexe
Ответ напрашивается сам собой:

Код:
 
<?
  preg_match("/\?&!=(.+)=#/",$str,$matches);
  print $matches[1];
?>
 


Всего записей: 793 | Зарегистр. 06-06-2002 | Отправлено: 22:19 25-08-2006
keniODESSA

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
помогите пожалуйста...вот скрипт  
 
<?
$ch = curl_init();  
$url = "http://angelscity.combats.ru/inf.pl?login=Dark+Genius&short=1";  
$submit_data = "";  
curl_setopt($ch, CURLOPT_URL, $url);  
curl_setopt($ch, CURLOPT_FAILONERROR, 1);  
curl_setopt($ch, CURLOPT_CURLOPT_HEADER, 1);  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
curl_setopt($ch, CURLOPT_TIMEOUT, 120);  
curl_setopt($ch, CURLOPT_HEADER, 1);  
$result = curl_exec($ch);  
curl_close($ch);  
echo "<pre>";    
echo $result;
 
?>
 
он пишет Что документ находиться here (и ссылка на то что мне надо)
 
как с той ссылки вытащить инфо?

Всего записей: 20 | Зарегистр. 18-08-2006 | Отправлено: 22:36 29-08-2006
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Прошу помочь, так как я сам лично полностью запутался и ни как не могу разобраться в чем проблема. У меня есть вот такое регулярное выражение:

Код:
preg_match_all("#<table.*?>(.*?)</table>#is", $this->pageContent, $tables);

По идее оно должно выбрать все таблицы которые есть в данном HTML коде, но он почему-то выбирает не совсем корректно. А именно он захватывает больше чем нужно, выглядит это приблизительно так:

Код:
<table ... <table ... </table>

надо заметить что в кодинге возможна ошибка и у внешней таблицы может и не быть закрывающегося тега, но по идее я указываю что он должен найти таблицу как можно короче, получается внешнюю часть он вообще не должен захватывать.
 
Вторая проблема связана с символом $ (доллар), мне надо заменить некую переменную значением $10.00 (десять долларов), но регулярное выражение доллар берет как указатель на индекс совпадения. Получается надо как то заблекслешить данный символ, как это сделать если значение находиться в переменной.

Код:
$value = '$10.00'; (вариант с ручным добавлением не получиться так как данная переменная получает значение программно, и не обязательно с долларом в начале, но и с долларом тоже может быть).
$buffer = preg_replace("#%%ITEM0%%#is", $value, $buffer);

 
Спасибо
 
Добавлено:
keniODESSA
Думаю вам ндоа указать:
curl_setopt($this->cUrl, CURLOPT_FOLLOWLOCATION, 1);
Но мне не понятно каким это боком касаеться регулярных выражений?

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 18:00 08-09-2006
Brodyaga



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Delphi6
Решение второй проблемы я вижу таким:
$buffer = preg_replace("#%%ITEM0%%#ise", '$value', $buffer);
Над первой проблемой думаем..

----------
Damn Metal

Всего записей: 2713 | Зарегистр. 07-01-2006 | Отправлено: 18:53 08-09-2006 | Исправлено: Brodyaga, 18:54 08-09-2006
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Brodyaga
Огромное спасибо, действительно заработало Сейчас читаю про данный модификатор (e)
 
По поводу второй проблемы, вот исходник страницы:
http://proxy-list.org/ru-board/table/test.htm
 
Вот сам скрипт:

Код:
<?php
  $content = implode('', file("test.htm"));
  preg_match_all("#<table.*?</table>#is", $content, $tables);
  print_r($tables[0]);
?>

 
А вот результат его работы:
http://proxy-list.org/ru-board/table/test.php
 
Если кому исходник для эксперементов то здесь:
http://proxy-list.org/ru-board/table/table.rar

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 19:19 08-09-2006
Brodyaga



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Прошу ткнуть пальцем в выдаче test.php где ошибка, не вижу в упор-два элемента-две таблицы
 
Добавлено:
Кстати, у меня проклёвывается мысль, что нужно использовать $tables[1] чтобы не было лишних совпадений.

----------
Damn Metal

Всего записей: 2713 | Зарегистр. 07-01-2006 | Отправлено: 20:54 08-09-2006
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Brodyaga
На страничке:
 
всего 3 таблицы а не 2 как показывает скрипт, нижняя правильно отображается но если вы обратите внимание на верхнюю то она находиться еще в одной не правильно созданной таблице. Мне нужно что бы вот эта первая таблица отображалась корректно, привожу код из работы скрипта:

Код:
Array
(
    [0] => <table border="0" cellpadding="0" cellspacing="0" height="30" width="780">
  <tbody>
    <tr>
      <td class="td1" width="95%">  
        Sites: <font color="#ccff66" size="3">All Sites</font><br>
        Period: <font color="#ccff66" size="3">01-09-2006 - 15-09-2006</font><br>
        <br>
 
        <table align="center" border="1" bordercolor="#666666" cellpadding="2" cellspacing="1" width="100%">
          <tbody>
            <tr align="center" bgcolor="#666666">
              <td style="color: rgb(255, 204, 0);" height="15">&nbsp;</td>
              <td style="color: rgb(255, 204, 0);" height="15">&nbsp;</td>
              <td colspan="2" style="color: rgb(255, 204, 0);" height="15">&nbsp;</td>
              <td colspan="2" style="color: rgb(255, 204, 0);" height="15">&nbsp;</td>
...
            </tr>
 
          </tbody>
        </table>
    [1] => <table align="center" border="1" bordercolor="#666666" cellpadding="2" cellspacing="1" width="100%">
          <tbody>
...

как вы заметили рег. выражение должно было захватить не таблицу с внешней таблицей а всего на всего внутреннюю. А наружную тоже должен был выделить но как отдельно. Если заметите то в начале два открытых тэга таблицы и всего один закрытый.
 
п.с. Всего рег. выражение теоретически должно было захватить 3 таблицы.
Подробнее...

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 21:45 08-09-2006
Brodyaga



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Код:
 
  preg_match_all("#<table.*?>(.*?)</table>?#is", $content, $tables);
  print_r($tables[0]);
 

Итак, что мы нашли-при таком раскладе:
0=>верхняя часть первой таблицы
1=>вторая
2=>третья таблица..
Если честно я сам с трудом понимаю почему оно так работает, но это все же 3 таблицы, а не 2
 
 
Добавлено:
Как поступить в этом случае? Если ПОСЛЕДНЯЯ строчка элемента массива не </table> то мы просто добавляем в её содержимое все следующие элементы, до закрывающего тега.
Это решение в лоб, а не в лоб-регулярное выражение с условной конструкцией ?:

----------
Damn Metal

Всего записей: 2713 | Зарегистр. 07-01-2006 | Отправлено: 22:52 08-09-2006 | Исправлено: Brodyaga, 22:59 08-09-2006
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Brodyaga
А у меня это не работает:
<?php
  $content = implode('', file("test.htm"));
  preg_match_all("#<table.*?>(.*?)</table>?#is", $content, $tables);
  print_r($tables[0]);
?>
в чем проблемы? Проверьте может вы что-то не дописали?
 
Cheery
Вот код который я поправил и вот что он выдает:

Код:
<?php
  $content = implode('', file("test.htm"));
  preg_match_all("#<table(.*?)>(.*?)</table>#is", $content, $tables);
  foreach ($tables[2] as $key=>$value) {
    echo "Table #$key<br>\r\n<table {$tables[1][$key]}>".$tables[2][$key]."</table>\r\n<hr>\r\n";
  }
 
  $content = '<td>value1<td>value2<td>value3<td>value4<td>';
  preg_match_all("#<td>(.*?)<td>#is", $content, $values);
  print_r($values[1]);
?>

http://proxy-list.org/ru-board/table/test.php
Все равно он почему-то он игнорирует внутреннюю таблицу! Я пофиксил сам HTML код что бы исключить вариант что ошибку он создает.
 
Прошу обратить внимание ваше на второй пример, думаю он как-то намекает в чем проблема. Результат как мы думаем должен быть value1, value2, value3 и value4 но на самом деле только value1 и value3 получается, если регулярное выражение захватило некую часть (нашла совпадение), она ее игнорирует в дальнейшем поиске. Разве не тоже самое происходит с таблицей? Она находит первую и игнорирует таблицу которую первая содержит! Но как теперь решить эту проблему? Помница у рег. выражений был модификатор указывающий на рекурсивный (повторный) поиск.
 
Добавлено:
Если подумать логически то результат таким и должен быть (конечно мы хотим иной), ибо можно догадаться как приблизительно работает алгоритм рег. выражения, он ищет определенное совпадение с начала строки, и после того как найдет его продолжает поиск уже в оставшейся части. Реально он должен сдвигаться всего на один символ и начинать поиск заново, но это наверно не учли, и если так делать то мы проигрываем в скорости!  
 
Внизу красным и зеленым я выделил те td тэги которые в паре:
 

Цитата:
<td>value1<td>value2<td>value3<td>value4<td>

 
Так как при поиске было заюзано <td>value1<td> соответственно третий <td> в списке уже не участвует в поиске! Теперь вопрос, уважаемые знатоки как этого избежать?
 
Добавлено:
А вот доказательства моим словам:

Код:
  $content = '<td>value1<td>value2<td>value3<td>value4<td>';
  preg_match_all("#td>(.*?)<#is", $content, $values);
  print_r($values[1]);

К сожалению таким решением в лоб выше указанную проблему не обойдеш

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 23:36 08-09-2006 | Исправлено: Delphi6, 01:28 09-09-2006
KADABRA



Великий покусатель
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Delphi6
В перел регулярные выражения более гибкие.
ИМХО это было бы легче на перле и сделать. Там как раз и есть рекурсивные регеспы.
 
А на ПХП получается вот такой вот изврат.
 
<?php
  $content = file_get_contents("Delphi_test.html");
  preg_match_all("#<table.*?(<table.*?(<table.*?</table>.*?)*</table>.*?)*</table>#is", $content, $tables);
  print_r($tables);
?>
 
Т.е. мы сами определяем максимальный уровень вложенности. Для данного примера это 3.

----------
Это не подпись.

Всего записей: 1718 | Зарегистр. 14-07-2003 | Отправлено: 11:39 09-09-2006 | Исправлено: KADABRA, 11:40 09-09-2006
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KADABRA
Если многие согласны с вашим решением, то тогда остается только одно, после того как найдутся все таблицы, вручную рекурсивно искать таблицы в уже полученных таблицах Хотя я не могу скрыть недовольство и такой большой промах со стороны рег. выражений! Как можно было не учесть такого банального варианта?

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 13:27 09-09-2006
Brodyaga



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Delphi6
Разработчики РНР-люди, а они то и совершают ошибки


----------
Damn Metal

Всего записей: 2713 | Зарегистр. 07-01-2006 | Отправлено: 13:31 09-09-2006
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP: Регулярные выражения (RegExp, Regular, eregi, preg)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru