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

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

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужно вырезать из текста ссылки в которых нет параметра href, тоесть:
 

Цитата:
<a style="...">текст</a>, <a name="...">текст</a>

- вырезать, текст оставить, а ссылки

Цитата:
<a href="...">текст</a> <a style="..." href="">текст</a>, <a href="" style="...">текст</a>, <a style="..." href="..." name="...">текст</a>

- оставить,
 
например так:
 

Цитата:
function a_con($matches) {return ($matches[4]);}
$file=preg_replace_callback("|(<a(?:href)*?>(.*?)(</a>)|i","a_con",$file);

 
 
тоесть <a(?:href)*?> тут надо сделать что-то типа группа элемента начинающая на <a и заканчивающаяся первым вхождением >, не включая строку href.

Всего записей: 29 | Зарегистр. 05-11-2008 | Отправлено: 23:32 03-04-2009 | Исправлено: brabus9, 23:33 03-04-2009
Cheery



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

Код:
  echo (preg_replace_callback("/<a(.*)>(.*)<\/a>/iUs","check",$str));
  function check($str)
  {
  return !eregi('href',$str[1])?$str[2]:$str[0];
  }


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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 01:35 04-04-2009 | Исправлено: Cheery, 01:36 04-04-2009
Rick_Ross

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

Код:
123/img001.jpg

Так вот, как из него вытащить img001 ?
Я пробовал так:

Код:
preg_replace("/(.*)\/(.*)\.(.*)/i","\\2",$str);

Но что-то ничего не выходит...

Всего записей: 52 | Зарегистр. 22-03-2009 | Отправлено: 22:56 04-04-2009
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Rick_Ross
чтобы не возиться с регулярками. если php выше 5.2, то
www.php.net/pathinfo
элемент filename возвращаемого массива
 
иначе
preg_replace("/(.*)\/(.*)\..*$/iU","$2",$str);

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 23:07 04-04-2009
Rick_Ross

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

Всего записей: 52 | Зарегистр. 22-03-2009 | Отправлено: 00:37 05-04-2009
brabus9

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

Цитата:
echo (preg_replace_callback("/<a(.*)>(.*)<\/a>/iUs","check",$str));
  function check($str)
  {
  return !eregi('href',$str[1])?$str[2]:$str[0];
  }  

во идея супер, только правильнее было бы

Цитата:
 
 function check($matches)
          {return (!eregi('href',$matches[1])?$matches[2]:$matches[0]);}
      $file=preg_replace_callback("|(<a[^>]*>)([^<]*)(<\/a>)|i","check",$file);


Всего записей: 29 | Зарегистр. 05-11-2008 | Отправлено: 06:05 11-04-2009
Cheery



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

Цитата:
только правильнее было бы  

ну почему.. когда стоит модификатор U, то остановится до первого >, так что какой смысл?
аналогично с обратным
это тоже самое, как и писать .*?
а перенос строки уже включил модификатором s
так что это одно и то же

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 06:15 11-04-2009 | Исправлено: Cheery, 06:22 11-04-2009
brabus9

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
понятно, буду знать, спасибо)) кстати не скажешь хороших учебников по PCRE в нете?

Всего записей: 29 | Зарегистр. 05-11-2008 | Отправлено: 10:19 11-04-2009
Cheery



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

Цитата:
кстати не скажешь хороших учебников по PCRE в нете?

http://us2.php.net/manual/en/pcre.pattern.php

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 19:39 11-04-2009
brabus9

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Извени забыл, про тему.
Нужно вырезать атрибуты тега в строке,  
например в

Цитата:
  alt="" src="index.gif" width="150"
вырезал
Цитата:
width="150"
, а остальное оставил кроме указанных,  
делал так:

Цитата:
$str=preg_replace("(?<=style|href|name|alt|src)=\"(.*?)\"/i","",$str);

 
тут он вырезает так  

Цитата:
alt src width="150"

 
но вот что-то не то делает, так-же пробовал:

Цитата:
$str=preg_replace("(?<!style|href|name|alt|src)=\"(.*?)\"/i","",$str);
$str=preg_replace("(?=style|href|name|alt|src)=\"(.*?)\"/i","",$str);
$str=preg_replace("(?!style|href|name|alt|src)=\"(.*?)\"/i","",$str);

тоже не помогает
 
кажется тут нужно два утверждения

Цитата:
(?<=соответсвующее шаблону)(?<!style|href|name|alt|src)

 
 

Всего записей: 29 | Зарегистр. 05-11-2008 | Отправлено: 21:28 19-04-2009 | Исправлено: brabus9, 22:30 19-04-2009
pchelovod

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
проблема с выделением ссылок на странице
нужно выделить все ссылки типа:
<a href="link">bla-bla-bla</a>
<a href='link'>bla-bla-bla</a>
<a target='_BLANK' href="link">bla-bla-bla</a>
<a href="link" target='_BLANK'>bla-bla-bla</a>
http://link
www.link
 
т.е. ссылка может быть определена хтмлом, а может и нет.
 
сейчас использую:

Код:
 
preg_match_all("/[\s>](\w+:\/\/)([^\s<]+)/",$msg['body'],$links);
 

 
проблема в том, что мне, ко всему прочему, важны еще и тексты ссылок (bla-bla-bla в примере)
 
Может у кого-нибудь есть идеи или готовые наработки?

Всего записей: 8 | Зарегистр. 22-04-2006 | Отправлено: 23:14 24-04-2009
DySprozin



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как-то так:

Код:
 
<?
$a=join('',file("1.txt"));
//Для двойных кавычек:
preg_match_all("/<a [^>]*href=[\"]([^\"]*)[\"]>([^<]*)<\/a>/sU",$a,$out);
//Для одинарных кавычек:
preg_match_all("/<a [^>]*href=[\']([^']*)[\']>([^<]*)<\/a>/sU",$a,$out2);
//Для неопределенных ссылок:
preg_match_all("/(www\.[\S]*)($|[\s])/sU",$a,$out3);
preg_match_all("/(http:[\S]*)($|[\s])/sU",$a,$out4);
 
echo $out[1][0].":".$out[2][0]; //Выведет: link:bla-bla-bla
echo $out2[1][0].":".$out2[2][0]; //Выведет: link:bla-bla-bla
echo $out3[1][0]; //Выведет: www.link
echo $out4[1][0]; //Выведет: http://link
?>
 

Всего записей: 30 | Зарегистр. 07-04-2009 | Отправлено: 02:44 25-04-2009
Andrey_Wlodimirovich



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ребята, нужна помощь в работе с рекуррентными структурами т.е. когда нужно учитывать вложенность элементов при замене. Одними регулярками тут не обойтись, логику проверки вложенности нужно писать нa php, помогите с алгоритмом (или примером ).
 
Например:

Код:
<span style="color: red;">цветной текст <span style="font-size: 16px;">большой текст</span>цветной текст</span>

нужно преобразовать это в такую конструкцию:

Код:
[color=red]цветной текст [size=16]большой текст[/size]цветной текст[/color]

 
для меня проблема в том что закрывающий тег(</span>) одинаков.
 
Или учитывая что "логику проверки вложенности нужно писать нa php" нужно было создать отдельную тему?

Всего записей: 1773 | Зарегистр. 15-11-2003 | Отправлено: 16:16 30-04-2009 | Исправлено: Andrey_Wlodimirovich, 16:22 30-04-2009
EGORR_TOO

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Научите. кто знает, как callback функции функции preg_replace_callback скормить второй аргумент, не полученный в ходе работы функции preg_replace_callback.
Подробней...
Есть файл со схемой расположения мест туристического автобуса (html таблица).  
Номера мест обозначены в таблице в виде {1},{2},{3},{4},{5},....{48}.
Задача забрать значение внутри скобок, проверить в БД статус места (занято, свободно, бронь, служебное) и заменить на DIV с соответствующим статусу классом CSS.
Мне показалось, что наиболее подойдет  preg_replace_callback.
Родил шаблон замены

Код:
$pattern ='/(\{)(\d+)(})/';

Написал функцию для callback  

Код:
 
global $arr;
 
$arr = array(25,28,30,35,40,48);
 
function Replace($matches, $arr)
{
 
    if(in_array($matches,  $arr)){
        return "<div class=\"not_for_sale\">".$matches[2]."</div>";
    }
 
}
 
 
$File =  preg_replace_callback($pattern, 'Replace', $File);
 

Второй аргумент (array) $arr - выборка из БД.  
Вот с ним возникли проблемы.  preg_replace_callback не хочет принимать его, поскольку он не является результатом работы самой функции.
На php.net нашёл совет объявить $arr global и тогда всё сработает. Но не сработало.
Вариант с create_function() тоже  не дал результата. Ругается на отсутствие второго аргумента.
Что я делаю не так?

Всего записей: 59 | Зарегистр. 03-10-2006 | Отправлено: 13:16 02-05-2009
alex00

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
global $arr; нужно запихнуть и внутри function Replace($matches, $arr)

Всего записей: 367 | Зарегистр. 31-08-2002 | Отправлено: 14:06 02-05-2009
EGORR_TOO

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я попробовал.
Определил $arr как global и внутри функции Replace().
И странное дело сотворилось: аргумент $arr был принят, но перед отрисовкой схемы(собственно результат работы всего этого огорода) сервер выдает пердюпреждение

Цитата:
Warning: Missing argument 2 for Replace()

Если аргумент потерян, то как же рисуется таблица?
Я для простоты и наглядности упростил(временно)Replace()  

Код:
global $arr;
$arr = "-- ";
 
function Replace($matches, $arr)
{
    global $arr;
    return "<div>".$arr.$matches[2]."</div>";
}

Получил вполне ожидаемый результат: схему с -- 1,-- 2,-- 3,-- 3,...-- 48.
И 48 ругательных строчек.
Я что-то ничего понять не могу. Зачем он ругается, если аргумент использует?

Всего записей: 59 | Зарегистр. 03-10-2006 | Отправлено: 16:04 02-05-2009
Cheery



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

Цитата:
Я что-то ничего понять не могу. Зачем он ругается, если аргумент использует?

он его не использует. глобальная вещь переопределяет
уберите второй аргумент из определения функции

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:25 02-05-2009
EGORR_TOO

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Так просто!!
Теперь все ясно.  
Расшифрую для тех, кто станет читать...
Незачем передавать в функцию то, что она может взять из массива GLOBAL. Она оттуда и брала. Поэтому и шла замена. А второй аргумент она не могла принять, отсюда и ругательный Warning.  
все встало на свои места.
Слава PHP! Великому и Могучему!
Спасибо Cheery!  

Всего записей: 59 | Зарегистр. 03-10-2006 | Отправлено: 21:56 02-05-2009 | Исправлено: EGORR_TOO, 22:20 02-05-2009
ForposT_ForeveR



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Здравствуйте.
Подскажите пожалуйста, как спарсить ссылки, на странице $url, точнее значения тега  
<a href=/lala/1>tra la la</a>. Спарсить именно те хрефы, которые в ссылке содержат слово 'lala'.
Заранее спасибо.

Всего записей: 525 | Зарегистр. 11-12-2004 | Отправлено: 13:26 03-05-2009 | Исправлено: ForposT_ForeveR, 13:28 03-05-2009
EGORR_TOO

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ForposT_ForeveR, ты уже как-то пытался это сделать?
Цитата из правил:

Цитата:
Когда задаете вопрос, укажите с самого начала, что вы все это уже сделали; это поможет понять, что вы не какой-нибудь лентяй, транжирящий чужое время.

Приведи код.

Всего записей: 59 | Зарегистр. 03-10-2006 | Отправлено: 15:33 03-05-2009 | Исправлено: EGORR_TOO, 15:36 03-05-2009
Открыть новую тему     Написать ответ в эту тему

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