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

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



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

Цитата:
 
Люди добрые, помогите, плиз. Пол дня мучаюсь, пытаясь понять регекспы.
А нужна-то фигня полная: найти ссылки в html вида href="ссылка" и заменить на href="домен/ссылка", при условии, что не указан домен.
 
Никак не могу понять как сделать !="http"
Где функция отрицания в регулярных выражениях?

единственное отрицание в регулярках это не содержание множества элементов в одном символе [^abc]  
четкое отрицание на 2 и более подряд идущих элемента [например "не ht"] сделать, насколько я знаю, нельзя.
 
вашу задачу можно решить такой регуляркой:
href="(.{0,4}|.{4}[^:][^"]*)"
 
 
.{4}[^:][^"]* -> (4 что угодно)+(один не : )+(сколько угодно не ") [используем факт того, что "http://" 5-м символом имеет ":" ]
.{0,4} -> 0..4 любых символа [для того чтоб попали маленькие ссылки в которых менее 5 символов]
 
этот вариант:
href="(.{0,4}|.{4}[^:][^"]*|.{0,4}[?#]+.{0,4}:.*)"
учитывает экзотические варианты ссылок вида
href="1?a=:X" и href="1#xa:1"

Всего записей: 2078 | Зарегистр. 08-01-2008 | Отправлено: 20:07 14-01-2012 | Исправлено: DrakonHaSh, 22:36 14-01-2012
Cheery



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

Код:
  $test='<a href="/text">link</a> and another <a href="http://www.site">link2</a>';
  echo preg_replace('/(href=[\'"])(?!https?:)/i', '\\1http://www.мой_сайт.ru', $test);

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

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 07:04 15-01-2012 | Исправлено: Cheery, 22:38 15-01-2012
DrakonHaSh



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

Цитата:
(?!https?:)

о, КРУТО !!!! не знал про Негативный просмотр вперёд (с отрицанием)  
жаль что не везде поддерживается. [в ТС 756a и парочке редакторов (кроме akelpad+SearchReplace.js), что проверил, не поддерживается]

Всего записей: 2078 | Зарегистр. 08-01-2008 | Отправлено: 15:34 15-01-2012 | Исправлено: DrakonHaSh, 15:35 15-01-2012
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DrakonHaSh
здесь речь о php, а не возможностях редакторов.
у редакторов, обычно, более ограниченные регулярки

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:37 15-01-2012 | Исправлено: Cheery, 22:38 15-01-2012
d1200

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DrakonHaSh, Cheery, Спасибо за помощь!
 
По поводу слэша в начале урла это, конечно, хорошо когда ссылки правильно оформляются. Но не редки случаи, когда указывается просто имя файла без указания пути.
 

Всего записей: 2 | Зарегистр. 03-05-2011 | Отправлено: 12:57 16-01-2012
Spy686



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
записываем список ссылок форумов, например:
 
http://forum.onliner.by/viewtopic.php?t=3795376  
http://forum.onliner.by/viewtopic.php?t=3795376&start=20  
http://forum.onliner.by/viewtopic.php?t=3795376&start=40
 
вытягиваем html, например:
находиться тут - view-source:http://forum.onliner.by/viewtopic.php?t=3795376
 
удаляем все кроме того что заключено в теги :
<div class="content" id="message_ЛЮБОЕ ЧИСЛО"
</div>
 
удаляем из оставшегося все что заключено в теги :
<img  
/>
 
удаляем из оставшегося все что заключено в теги :
<blockquote
</blockquote>  
 
удаляем из оставшегося все что заключено в теги (закрывающий должен быть с запятой) :
<strong
</strong>,
 
удаляем:
p>
 
удаляем:
<br />
 
удаляем все оставшиеся теги (strong, em, <img ... />, <a ... >, </a> и др.) и мусор от тегов (>,<,/,):
 
на выходе получаем .txt-файл :
 
Барахолку Onliner.by любят и ценят: около ста тысяч человек посещают её ежедневно. Теперь мы делаем этот супер-популярный раздел еще удобнее для всех, кто хочет продать или купить автомобиль.
!-- u --AB.ONLINER.BY!-- u --
Что интересного в новой Автобарахолке:
- Совершенно новый сервис, который теперь находится в разделе Авто.
- Простота и быстрота подачи объявления. Вы указываете только самое важное. При желании вы всегда можете расширить информацию об авто добавив, например, Carfax или полный список опций. Приглашаем официальных дилеров и автохаусы.
- Теперь поиск работает в режиме реального времени! Всего пару кликов и у вас есть список кандидатов на покупку, которые соответствуют вашим требованиям.
- В объявления лекго добавить много фотографий хорошего разрешения и также легко их потом просмотреть. Рассмотрите машину в мельчайших деталях!
- Все лучшее из оригинальной барахолки. UP'ы и горячие комментарии к объявлениям. Задайте вопрос продавцу &quot;не отходя от кассы&quot; или обсудите классную тачку!
Мы немного поработаем в тестовом режиме, чтобы отловить все ошибки и учесть ваши ценные замечания и постепенно старая Автобарахолка
переместится на новый сервис.
Если вам есть что продать и вы разместили ваше объявление в обычной барахолке - не теряйте время и добавьте его в новую Автобарахолку прямо сейчас, внимание к первым предложениям будет огромное!
Предложения, пожелания и конструктивная критика приветствуются.
в последней опере выпадающий список выбора марки авто дергается при раскрытии.
Поздравляем!
отлично сделано. онлайнер, утопим ав и абв
возможность редактировать комментарий будет?
Зашел и охренел какие там тачки &quot;продают&quot;. Думал что может с автосалоном в Дубае перепутал    Только потом дошло, что там на 99% фейк забит  
 
 А мы щас поправим как раз.
хорош!
 Но почему всё-же поддомен не av.onliner.by ?  
 
 
как твкое осуществить ?

Всего записей: 193 | Зарегистр. 17-12-2010 | Отправлено: 20:56 05-02-2012
Spy686



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
есть успехи
 
<?php  
  $content = file_get_contents('http://forum.onliner.by/viewtopic.php?t=3795376'); //вытягиваем html
  preg_match_all("#<div class=\"content\" id=\"message_+.*?</div>#is", $content, $tables); //удаляем все кроме того что заключено в теги : <div class="content" d="message_ЛЮБОЕ ЧИСЛО" </div>  
  print_r($tables[0]);  
?>
 
 
две первых задачи выполнены :
 
1. вытягиваем html, например:  
находиться тут - view-source:http://forum.onliner.by/viewtopic.php?t=3795376  
 
2. удаляем все кроме того что заключено в теги :  
<div class="content" id="message_ЛЮБОЕ ЧИСЛО"  
</div>  
 
но это все пронумеровано :
Предложения, пожелания и конструктивная критика приветствуются.
 
[1] =>
в последней опере выпадающий список выбора марки авто дергается при раскрытии.
 
[2] =>
Поздравляем!
 
[3] =>
 
как сделать так что бы не нумеровалось ?
 
и еще в конце лишняя скобка ")" какаята, хотя её после последнего </div> нету ?

Всего записей: 193 | Зарегистр. 17-12-2010 | Отправлено: 01:46 08-02-2012
Spy686



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
есть ответ  
 
 
<?php  
  $content = file_get_contents('http://forum.onliner.by/viewtopic.php?t=3795376'); //вытягиваем html
  preg_match_all("#<div class=\"content\" id=\"message_+.*?</div>#is", $content, $tables); //удаляем все кроме того что заключено в теги : <div class="content" d="message_ЛЮБОЕ ЧИСЛО" </div>  
foreach($tables[0] as $value)
{ echo $value;  }
?>

Всего записей: 193 | Зарегистр. 17-12-2010 | Отправлено: 15:00 08-02-2012
BABAYKA



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

Всего записей: 108 | Зарегистр. 09-10-2004 | Отправлено: 10:27 23-02-2012 | Исправлено: BABAYKA, 12:14 24-02-2012
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Прошу прощения за небольшую предысторию.
Написал коллеге по работе письмо следующего содержания:
 
Can you to help me to improve my Reg Ex?
 
For most clarity, please run –
<?php
 
header('Content-Type: text/plain');
 
$pattern ='/<a\s[^>]*href\s*=\s*([\"\']??)([^\">]*?(&page=\d)|[^\" >]*?)\\1[^>]*>(.*)<\/a>/siU';
 
$subject = '<a href="http://test.domain.kvet/blogtest3/?p=31&page=2">2</a>';
preg_match($pattern, $subject, $matches);
print_r($matches);
 
$subject = '<a href="http://test.domain.kvet/blogtest3/?p=31">2</a>';
preg_match($pattern, $subject, $matches);
print_r($matches);
 
As you can see, it run very fine for now, but I do not sure, if the part –  
 
([^\" >]*?(&page=\d)|[^\">]*?)
 
is best way for it…
 
Do you think, it possible to improve the part
 
([^\" >]*?(&page=\d)|[^\">]*?)
 
?
 
На что коллега ответил: Сan you please explain what it is you are trying to do and what do you need help with?
 
Короче, блин, я хренею, разговор немого с глухим! А мне так показалось, что всё было чётко объяснено. Но, видимо это не так, поэтому, задаю тот же вопрос по русски.
 
Как видно из выше приведённого кода, я получаю href из html ссылки. Причём, если в QUERY_STRING присутствует строка &page=\d , то мне необходимо получить эту строку в отдельный элемент массива $matches, а если эта строка отсутствует в QUERY_STRING, то тогда в этом элементе должна оказаться пустая строка ''.  
Чего я и добиваюсь при помощи части ([^\" >]*?(&page=\d)|[^\">]*?) , всё работает нормально, но вот вопрос, я опасаюсь, что способ ([^\" >]*?(&page=\d)|[^\">]*?) несколько неуклюж. Вот я и хочу спросить, существует ли более оптимальный способ?  
 
Спасибо.

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 11:35 22-03-2012 | Исправлено: israel_rider, 11:46 22-03-2012
Cheery



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

Цитата:
А мне так показалось, что всё было чётко объяснено.

он правильно поступил, попросив описать на словах чего вы хотите добиться.  
какой смысл смотреть код, если он изначально делает не то, что хочется - иначе бы и вопроса не было.
типичный ответ того, кто не хочет тратить свое время зря.
 

Цитата:
(&page=\d)

а если там 2 и более цифры?

Цитата:
[^\" >]

а если кавычки одинарные?
 

Цитата:
&page

а если в адресе идет сразу '/?page=2' ?

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:09 22-03-2012 | Исправлено: Cheery, 22:10 22-03-2012
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Cherry, огромное спасибо за Ваши замечания, надо же… не учёл.

Цитата:
а если кавычки одинарные?
 
Честно говоря, само выражение писал не я, пусть уж это останется на совести писавшего. Допустим, почему после  
[\"\']
Стоит
??   .
Ну второй знак вопроса понятно – лечит от жадности. А первый?  
При помощи  
[\"\']??
мы хотим определить кавычки, обрамляющие URL в атрибуте href ссылки HTML. Но кавычки должны быть обязательно, href без кавычек – это очень старый стандарт, и не встречается уже ни где вообще. А квантификатор ? обозначает ноль или один.
Далее, при помощи  
[^\">]
мы хотим исключить символы, которые запрещены в атрибуте href . Но таких символов может быть несколько, не одни только кавычки. Уж проще перечислить символы, которые имею право там быть.
И почему после группы [^\">] квантификатор – звёздочка? Звёздочка – это ноль или сколько угодно. Но URL не может состоять из нуля символов, следовательно там должен быть квантификатор – плюс.

Цитата:
а если в адресе идет сразу '/?page=2' ?

Вообще то, этого быть не может, поскольку регулярное выражение изменено мною с одной специфической целью – что бы продукт нашей фирмы поддерживал следующую фичу - Styling Page-Links http://codex.wordpress.org/Styling_Page-Links .
Но, тогда, просто из любви к искусству, переписал:
 
<?php  
 
header('Content-Type: text/plain');  
 
$pattern ='/<a\s[^>]*href\s*=\s*([\"\']??)([^\">]*?([\?&]page=\d+?)[^\">]*?|[^\" >]*?)\\1[^>]*>(.*)<\/a>/siU';  
 
$subject = '<a href=\'http://test.domain.kvet/blogtest3/?page=20&p=31\'>2</a>';  
preg_match($pattern, $subject, $matches);  
print_r($matches);  
 
$subject = '<a href=\'http://test.domain.kvet/blogtest3/?p=31\'>2</a>';  
preg_match($pattern, $subject, $matches);  
print_r($matches);

Цитата:
а если там 2 и более цифры?
 
С учётом Вашего замечания, вот окончательный результат –  
<?php  
 
header('Content-Type: text/plain');  
 
$pattern ='/<a\s[^>]*href\s*=\s*([\"\']??)([^\">]*?(&page=\d+?)|[^\" >]*?)\\1[^>]*>(.*)<\/a>/siU';  
 
$subject = '<a href="http://test.domain.kvet/blogtest3/?p=31&page=20">2</a>';  
preg_match($pattern, $subject, $matches);  
print_r($matches);  
 
$subject = '<a href="http://test.domain.kvet/blogtest3/?p=31">2</a>';  
preg_match($pattern, $subject, $matches);  
print_r($matches);

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 23:12 22-03-2012 | Исправлено: israel_rider, 23:22 22-03-2012
Spy686



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
допустим есть такое:
 
message_35936118"><blockquote class="uncited"><cite>SPzzz:</cite>
<p> spy686@gmail.com в чем вопрос ? заберут так же, как не студента. разница в том, что проще вручить повестку. насчет продолжения учебы и нюансов вроде призыва посреди сессии не знаю. на всякий случай:
</p></blockquote>
<p> Волнует продолжение учебы, а так же призыв посреди семестра.</p>
message_35937211"><p>В законе о военской собязанности и воинской службе сказано<br />
Статья 32. Отсрочка от призыва граждан на срочную военную службу, службу в резерве<br />
 
надо удалить :
 
message_35936118">, а вернее:все вот эти куски: message * ">

Всего записей: 193 | Зарегистр. 17-12-2010 | Отправлено: 23:23 24-03-2012
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Spy686
$str = preg_replace('/message_\d+">/i', '', $str);

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 23:24 24-03-2012
Spy686



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

Цитата:
допустим есть такое:  
 
message_35936118"><blockquote class="uncited"><cite>SPzzz:</cite>  
<p> spy686@gmail.com в чем вопрос ? заберут так же, как не студента. разница в том, что проще вручить повестку. насчет продолжения учебы и нюансов вроде призыва посреди сессии не знаю. на всякий случай:  
</p></blockquote>  
<p> Волнует продолжение учебы, а так же призыв посреди семестра.</p>  
message_35937211"><p>В законе о военской собязанности и воинской службе сказано<br />  
<blockquote class="uncited"><cite>SPzzz:</cite>  
<p>  ПриУед Новый год  
</p></blockquote>  
Статья 32. Отсрочка от призыва граждан на срочную военную службу, службу в резерве<br />
 
 
 
 

 
надо удалить:
 
<blockquote *</blockquote>

Всего записей: 193 | Зарегистр. 17-12-2010 | Отправлено: 17:04 25-03-2012
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Spy686
а может почитаете о регулярках ?) там ничего, в принципе, сложного нет.

Цитата:
<blockquote *</blockquote>

вы уже почти и написали, в принципе. если речь идет именно об удалении всего между тегами blockquote, включая их самих.
/<blockquote.*?<\/blockquote>/s

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 23:56 25-03-2012 | Исправлено: Cheery, 00:05 26-03-2012
Tstf



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Есть строка
 
Перфоратор Vertex VR-1403"  
 
Раньше было такое условие
 
            $good_array [$key] [4] = trim ( preg_replace ( "/[^a-zA-Z0-9а-яА-ЯёЁ\_\-]+/mi", " ", $match [0] [0] ) );
 
Сейчас из-за того, что строка стала приходить в UTF-8 переделал регулярку в такое
 
$good_array [$key] [4] = trim(mb_ereg_replace  ( "/[^a-zA-Z0-9а-яА-ЯёЁ\_\-]+", " ", $match [0] [0] ));
 
Что я не так делаю?
На конце знак кавычек не убирается.

----------
Заработок 2.0

Всего записей: 788 | Зарегистр. 22-04-2003 | Отправлено: 20:00 27-03-2012
Cheery



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

Цитата:
$good_array [$key] [4] = trim(mb_ereg_replace  ( "/[^a-zA-Z0-9а-яА-ЯёЁ\_\-]+", " ", $match [0] [0] ));  

уверены? потому что тут ошибка.
 

Цитата:
На конце знак кавычек не убирается.

на каком "конце"? пример покажите

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:01 27-03-2012
Tstf



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вот
 
Перфоратор Vertex VR-1403"
 

Код:
$good_array [$key] [4] = trim(mb_ereg_replace  ( "/[^a-zA-Z0-9а-яА-ЯёЁ\_\-]+", " ", $match [0] [0] ));  

 
 
Какая ошибка?

----------
Заработок 2.0

Всего записей: 788 | Зарегистр. 22-04-2003 | Отправлено: 20:21 27-03-2012
Cheery



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

Цитата:
Какая ошибка?

нет, просто забыл насчет синтаксиса ereg
но она и приводит к тому, что замены нет
 

Цитата:
/[^a-zA-Z0-9а-яА-ЯёЁ\_\-]+

означает заменить кусок, который начинается с / и не включает символы из квадратных скобок

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:49 27-03-2012
Открыть новую тему     Написать ответ в эту тему

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