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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
Antyrat



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вот такая задача не могу никак справитса к примеру есть вот такое:

Код:
<span style=\"width: 99%\"><a href=\"javascript:parent.JSChatSayTime(\'см.15:54:53\');\"  target=\"tmp\"><font color=\"#8A8A8A\">15:54:53</font></a> <a target=\"tmp\" href=\"javascript:;\" onclick=\"parent.JSChatSayNick(\'цуц\')\"><b><font color=\"#CC0000\">цуц</font></b></a>: <font color=\"#004000\"><b><img src=\"/templates/govorun_com_ua/smile/44.gif\" border=\"0\">  <img src=\"/templates/govorun_com_ua/smile/44.gif\" border=\"0\"> <img src=\"/templates/govorun_com_ua/smile/44.gif\" border=\"0\"> <img src=\"/templates/govorun_com_ua/smile/44.gif\" border=\"0\"> <img src=\"/templates/govorun_com_ua/smile/44.gif\" border=\"0\"> см.15:54:14  см.15:54:39 </b></font></span>

мне нужно заменить к примеру все см.**:**:** но не  

Код:
<a href=\"javascript:parent.JSChatSayTime(\'см.15:54:53\');\"  target=\"tmp\">

 
Был бы благодарен за помощь

Всего записей: 70 | Зарегистр. 06-11-2006 | Отправлено: 16:10 03-08-2007
vitovt



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
подскажите плз, не могу справиться  регуляркой:
есть код:

Цитата:
<td   colspan="7">
     РАЙОН<br>
тут какой-то текс, неважно какой его может быть много<br />
<br>тел.   555885544</td>

 
и я вот написал так (задача стоит в том, чтобы в таких ячейках именно с colspan сделать все по центру и жирным)
 
$content_cleaned = preg_replace("{<td(.*)colspan=\"7\">(.*?)</td>}","<td colspan=\"8\" align=center><b>\${2}</b></td>",$content_cleaned);
 
но что-то не срабатывает (

Всего записей: 1087 | Зарегистр. 02-05-2002 | Отправлено: 18:13 23-08-2007 | Исправлено: vitovt, 18:15 23-08-2007
Brodyaga



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

Код:
 
$content_cleaned=' <td   colspan="7">
     РАЙОН<br>
тут какой-то текс, неважно какой его может быть много<br />
<br>тел.   555885544</td>';
 $content_cleaned = preg_replace("{\<td(.*?)colspan\=\"7\">(.*?)\<\/td\>}is","<td colspan=\"8\" align=center><b>\${2}</b></td>",$content_cleaned);
echo $content_cleaned;
 
 


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

Всего записей: 2713 | Зарегистр. 07-01-2006 | Отправлено: 18:31 23-08-2007
vitovt



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Brodyaga
почему-то все такие ячейки в таблице идут сразу в самом начале (
 
Добавлено:
т.е поясню, когда изначально примерно такой
 

Цитата:
 
 
<tr>
<td   colspan="7">
    ГРАЙОН<br>
 
парпара прап <br />
 
<br>тел.   8-0152-74--52-37</td>
</tr>
 
<tr>
<td  >
1.<br />
</td>
 
<td   colspan="2">
СПК «Нива –2003»,<br />
 
д. Ратичи,<br />
 
<br>т5555<br />
</td>
 
<td  >
животновод<br />
 
механизатор<br />
</td>
 
<td  >
1<br />
 
1<br />
</td>
 
<td  >
250<br />
 
250<br />
 
 <br />
</td>
 
<td  >
 
неблагоустроенные сельские дома<br />
</td>
</tr>
 
<tr>
<td   colspan="7">
РАЙОН<br>  
</td>
</tr>
 
 
 

 
а после применения это replace получаеться
 

Цитата:
 
<tr>
<td colspan="7" align=center><b>
     РАЙОН<br>
про про про<br />
 
<br>тел.   4--52-37</b></td>
</tr>
 
<tr>
<td colspan="7" align=center><b>
 РАЙОН<br>  
рhghfgh
<br>тел.  -58-52</b></td>
</tr>
 
<tr>
<td colspan="7" align=center><b>
   РАЙОН<br>
пропро                          <br />
 
<br>52</b></td>
 
</tr>
 

Всего записей: 1087 | Зарегистр. 02-05-2002 | Отправлено: 19:10 23-08-2007 | Исправлено: vitovt, 19:15 23-08-2007
RayZ



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Братцы, помогите немного.
надо разбить перечень значений строки (часть строки SQL запроса), к примеру:
 
"1, '2' , 'пример', '', NULL, '1,2,3', 'a, bc', 2221, 12, '12\'.., \'3123'"
 
Проблема в том, что просто делать split(',',...) нельзя, так как в значении могут попадаться запятые... Дошел примерно до сего:  
preg_match_all(((\')?([a-z0-9\\\/А-Яа-я,\. \-]+|(\'\'))(\')?)(, )? ... )
Это не совсем чистое решение, мне кажется в некоторых случаях оно будет лажать

Всего записей: 381 | Зарегистр. 10-04-2002 | Отправлено: 23:00 18-11-2007
paulvasykov

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
while (preg_match('@(<table([^>]*>))((?>.(?!<table([^>]*>)))*?)(</table([^>]*>))@is',$formHTML))  
{ $this->deleteparsed=1; //Удалять распарсенные таблицы
 $formHTML= preg_replace_callback('@(<table([^>]*>))((?>.(?!<table([^>]*>)))*?)(</table([^>]*>))@is',
 array(&$this, "filltags"),$formHTML);}
 
filltags - Процедура сохранения науденных тэгов в массив.  
 
Использую следующий regex, выдерания таблиц, без вложенных таблиц.
мне необходимо отсортировать данные таблиц, по порядку, как они идут в html.
Можно использовать позицию найденной <table...>, но как это делаеться в regex?
Либо можно сначала брать таблицы с максимальной вложенностью таблиц, и разбирать их рекурсивно. Но морока с деревом тогда. и я не смогу придумать regex для выбора таких таблиц. сложнее...

Всего записей: 4 | Зарегистр. 02-07-2007 | Отправлено: 21:00 29-12-2007
Delphi6



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

Цитата:
мне необходимо отсортировать данные таблиц, по порядку, как они идут в html

А почему не хотите воспользоваться прямо preg_match_all? Она вернет все варианты и как раз в той последовательности в которой они вам нужны.
 
Ну и конечно если речь пойдет о вложенных таблицах то однозначно посоветую искать рекурсивно. Также если вам хочется через preg_match вы может вручную указывать с какой позиции искать (позиция последнего найденного объекта вам возвращается вместе с результатом) PREG_OFFSET_CAPTURE
 
п.с. Если вы делает прасинг учтите что часто бывает когда таблицы просто не закрываются или не имеют парных <td> и <tr>.

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 23:43 29-12-2007 | Исправлено: Delphi6, 23:46 29-12-2007
paulvasykov

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо Delphi6!. PREG_OFFSET_CAPTURE  То что нужно.  
 
Начал парсить html, и теперь выкидывает (Пишет DNS error, вообще глюк PHP???
) на preg_match. Наверно какоенибудь переполнение regex?  
 
<?
$html = implode('',file("zz.txt"));
preg_match(
    '@(<table([^>]*>))((?>.(?!<table([^>]*>)))*?)(</table([^>]*>))@is',  
    $html,$rs,PREG_OFFSET_CAPTURE);
 
?>
zz.txt тут http://www.moddi.ru/zz.2007.12.31.@.00.49.rar
 
Первый раз глюк такой фижу, как бороться?.
 
P.S. С Новым 2008 Годом.

Всего записей: 4 | Зарегистр. 02-07-2007 | Отправлено: 00:49 31-12-2007
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
paulvasykov
С наступающим желаю по меньше багов в скриптах

Цитата:
Пишет DNS error, вообще глюк PHP???

Это точно ни как не касается preg_match или любой другой функции в данном коде. Это больше похоже на ошибку apache, ну типа что-то настроено не так.
 
Еще очень удобно вместо конструкции $html = implode('',file("zz.txt")); воспользоваться прямо file_get_content она эквивалентна file за тем исключением что возвращает не массив прямо одну строку (плюс сохранены оригинальные переносы строк, а они могут быть как и \n так и \r\n)
 
p.s. Код работает на моем локально ПК + на локальном апаче

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 01:35 31-12-2007 | Исправлено: Delphi6, 01:36 31-12-2007
paulvasykov

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
у мя appach 1.33 + php 4.4.4.  
в php 5.xx работает , действительно.  нет,  в 5м перестает работать appach, после выполнения данного скрипта.  
поставил 16 метров памяти, в настройках appacha.
 
В скрипте используеться file(url), URL без www (http://forum.ru-board.com)....
может из за этого?  но 2 первых странички грузяться.....
 
на 4м php если оставить строчек 50 из zz.txt, то прокатывает, тоесть regex получаеться?
 
Залил на хостинг, тама все работает.  
Не смог настроить у себя локально.

Всего записей: 4 | Зарегистр. 02-07-2007 | Отправлено: 02:42 31-12-2007
CoolKonig



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите плиз составить такое регулярное выражение(проверка) заголовка комментария
- должен начинаться только с букв
- может содержать буквы, цифры, пробелы, кавычки, вопросительный и восклицательный знак, тире и двоеточие.
Спасибо

Всего записей: 102 | Зарегистр. 12-10-2005 | Отправлено: 15:46 31-12-2007
dimon308



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
народ ищите программу RegexBuddy и с помощью нее делайте регулярные выражения!
там хороший мануал, и куча примеров!

Всего записей: 15 | Зарегистр. 01-09-2005 | Отправлено: 18:49 31-12-2007
Delphi6



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

Цитата:
В скрипте используеться file(url), URL без www (http://forum.ru-board.com)....
может из за этого?  но 2 первых странички грузяться.....

Очень вероятно что проблема именно в памяти, у меня например стоит 128мб, и не раз было что даже при таком раскладе ложился весь PHP, просто при получении странички она занимает немного больше места чем положено, и возможно у вас где-то утечка данных, можете привести весь пример скрипта где все ложиться? Я на локальном ПК понижу лимит и проверю
 
Добавлено:
CoolKonig

Цитата:
Помогите плиз составить такое регулярное выражение(проверка) заголовка комментария
- должен начинаться только с букв
- может содержать буквы, цифры, пробелы, кавычки, вопросительный и восклицательный знак, тире и двоеточие.

Это больше похоже на "напишите вместо меня" Сделайте наброски а мы уже подправим, просто если мы вас накормим это хорошо а вот если научим ловить рыбу то это супер

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 03:22 01-01-2008 | Исправлено: Delphi6, 03:22 01-01-2008
CoolKonig



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

Цитата:
Это больше похоже на "напишите вместо меня" [Image] Сделайте наброски а мы уже подправим, просто если мы вас накормим это хорошо а вот если научим ловить рыбу то это супер

Это понятно Вот что сделал:

Код:
preg_match("/^[0-9a-zA-Za-яА-Я]+[0-9a-zA-Za-яА-Я!?)\-\.\,\040]*$/", $text)

тут проверка на правильность содержит ли текст латинские буквы, цифры, ! ? : ( ) - . , и пробел(040 код), а также текст должен начинаться только с букв или цифр.
 
У меня другой вопрос, проверка текста идет уже после того как он обработан через htmlspecialchars, как мне пропустить кавычки(") и амперсант(&) их коды &quot; и &amp;
делаю вот так:

Код:
preg_match("/^[0-9a-zA-Za-яА-Я]+[0-9a-zA-Za-яА-Я!?)\-\.\,\040]*(&quot;&amp;)$/", $text)

но так неправильно, потому как начинает проскакивать недопустимый (;)
доки читаю по регулярным, но тут никак не пойму как сделать.

Всего записей: 102 | Зарегистр. 12-10-2005 | Отправлено: 18:18 01-01-2008 | Исправлено: CoolKonig, 18:20 01-01-2008
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CoolKonig
А у вас нет возможности перегнать назад -> проверить -> перегнать назад?
 
Но как вариант можно попробовать сделать вот так:

Код:
<?php  
  $test1 = "&quot; some example text is here";
  $test2 = "&amp;some example text is here";
  $test3 = "&amp ;some example text is here";
  var_dump(preg_match("/^(?:&quot;|&amp;|[0-9a-zA-Za-яА-Я]{1})[0-9a-zA-Za-яА-Я!?)\-\.\,\040]*$/", $test1));
  var_dump(preg_match("/^(?:&quot;|&amp;|[0-9a-zA-Za-яА-Я]{1})[0-9a-zA-Za-яА-Я!?)\-\.\,\040]*$/", $test2));
  var_dump(preg_match("/^(?:&quot;|&amp;|[0-9a-zA-Za-яА-Я]{1})[0-9a-zA-Za-яА-Я!?)\-\.\,\040]*$/", $test3));
?>

 
У вас стоял + что значит 1 или 0 совпадений, это вам не подходит, так как если строка начнется с ! то она тоже подойдет, так как в таком случае + воспримется как 0 совпадений а вот уже "второй" символ у вас может быть любым, включая !. Вам надо юзать однозначно {1} что значит один символ.

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 18:37 01-01-2008 | Исправлено: Delphi6, 18:38 01-01-2008
CoolKonig



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

Цитата:
А у вас нет возможности перегнать назад -> проверить -> перегнать назад?  

Можно, но мне кажется так лучше зачем лишние действия совершать =)  
 

Код:
!preg_match("/^(?:&quot;|[0-9a-zA-Za-яА-Я]){1}(?:&quot;|&amp;|[0-9a-zA-Za-яА-Я!?()\-\.\,\040])+$/", $text)

вот такая конструкция мне наиболее подходит, проверил работает вроде нормально.  
Есть правда один минус - можно в тексте подряд поставить хоть десять кавычек, ну да ладно. Спасибо большое за помощь!

Всего записей: 102 | Зарегистр. 12-10-2005 | Отправлено: 19:20 01-01-2008
evle



1 + int rand(100);
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Delphi6

Цитата:
У вас стоял + что значит 1 или 0 совпадений, это вам не подходит, так как если строка начнется с ! то она тоже подойдет, так как в таком случае + воспримется как 0 совпадений а вот уже "второй" символ у вас может быть любым, включая !. Вам надо юзать однозначно {1} что значит один символ.
 

Ужас какой. Что новый год с людьми делает…
CoolKonig
По заявленным условиям получается как-то так:
/^[a-zA-Za-яА-Я](?:&quot;|&amp;|[0-9a-zA-Za-яА-Я!?—)(:\-\.\,\040])*$/

----------
For every complex problem, there is a solution that is simple, neat, and wrong.

Всего записей: 2110 | Зарегистр. 03-02-2005 | Отправлено: 19:25 01-01-2008
CoolKonig



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

Цитата:
Ужас какой. Что новый год с людьми делает…
CoolKonig
По заявленным условиям получается как-то так:
/^[a-zA-Za-яА-Я](?:&quot;|&amp;|[0-9a-zA-Za-яА-Я!?—)(:\-\.\,\040])*$/
 

Немного изменил требования=) Текст может начинаться и с кавычек.

Всего записей: 102 | Зарегистр. 12-10-2005 | Отправлено: 19:34 01-01-2008
evle



1 + int rand(100);
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CoolKonig
Я про то, что {1} и «+ что значит 1 или 0 совпадений» — это какая-то чушь несусветная.
Если с кавычками в начале, то
 /^(?:&quot;|[a-zA-Za-яА-Я])(?:&quot;|&amp;|[0-9a-zA-Za-яА-Я!?—)(:\-\.\,\040])*$/
Хотя логичнее всё-таки делать проверку до htmlspecialchars.

----------
For every complex problem, there is a solution that is simple, neat, and wrong.

Всего записей: 2110 | Зарегистр. 03-02-2005 | Отправлено: 19:41 01-01-2008
Delphi6



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

Цитата:
Ужас какой. Что новый год с людьми делает…  

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

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 19:54 01-01-2008
Открыть новую тему     Написать ответ в эту тему

Страницы: 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