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

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



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

Цитата:
Cheery

да, только id, тоесть   v=Uhol3aK8kEQ
 
пробовал добавить эту строчку, не получается  
 | /watch?feature=player_embedded&\?v=  # ?????????????????????????

Всего записей: 79 | Зарегистр. 26-08-2009 | Отправлено: 21:25 03-06-2013 | Исправлено: n0byk, 21:30 03-06-2013
Cheery



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

Код:
$string = 'youtube.com/watch?feature=player_embedded&v=Uhol3aK8kEQ';  
 
preg_match("/v=(\w{10,12})/Ui" , $string, $result);  
 
var_dump($result);  


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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:28 03-06-2013
n0byk



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Cheery
 
То есть можно вот так сделать:
 
//youtube.com/watch?v=Uhol3aK8kEQ&list=SPJuzssrVaWjbIpmb36XabFUkiowJQQ9DH
//youtube.com/watch?feature=player_embedded&v=Uhol3aK8kEQ
$pattern =  
        '%^# Match any YouTube URL
        (?:https?://)?  # Optional scheme. Either http or https
        (?:www\.)?      # Optional www subdomain
        (?:             # Group host alternatives
          youtu\.be/    # Either youtu.be,
        | youtube\.com  # or youtube.com
          (?:           # Group path alternatives
            /embed/     # Either /embed/
      | /v/         # or /v/
          | /watch\?v=  # or /watch\?v=
      | /v=(\w{10,12})/Ui  # youtube.com/watch?feature=player_embedded&v=
          )             # End path alternatives.
        )               # End host alternatives.
        ([\w-]{10,12})  # Allow 10-12 for 11 char YouTube id.
        $%x'
        ;
$result = preg_match($pattern, $url, $matches);
 
А вторую строку как разобрать?    

Всего записей: 79 | Зарегистр. 26-08-2009 | Отправлено: 22:38 03-06-2013 | Исправлено: n0byk, 22:41 03-06-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
n0byk
вы v= просили или все разбирать? или вам нужно еще отлавливать, что это youtube ссылка?
какая разница то, первая строка или вторая?
 
у вас все равно сейчас паттерн неправильно записан

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:50 03-06-2013 | Исправлено: Cheery, 22:51 03-06-2013
n0byk



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Cheery
 с youtube видео можно взять 4 способами
 
Обычная ссылка: youtube.com/watch?v=pHARspTJyeY
 
Короткая ссылка: youtu.be/pHARspTJyeY
 
Ссылка из плейлиста: youtube.com/watch?v=pHARspTJyeY&list=SPJuzssrVaWjbIpmb36XabFUkiowJQQ9DH
 
Длинная ссылка от встроенного видео на сайте: youtube.com/watch?feature=player_embedded&v=pHARspTJyeY
 
Оригинал этой регулярки вытаскивает из строки pHARspTJyeY 2 верхними способами
Далее гинерируется нормальная ссылка с видео  

Код:
 
$data['object'] = "<iframe src='http://www.youtube.com/embed/{$matches[1]}?wmode=opaque' type='text/html' width='590' height='332' frameborder='0'></iframe>";
 

нужно в эту регулярку добавить 2 нижних варианта ссылки.
 
 
UPD. Вот файл, там 4 вида ссылки, по каждому виду ссылки должно создаваться рабочее окно с видео (пока работают 2 верхних способа, как переписать регулярку я не знаю.)

Код:
 
<?php
//Обычная ссылка: youtube.com/watch?v=0g9poWKKpbU
$string = 'http://www.youtube.com/watch?v=0g9poWKKpbU';  
//Короткая ссылка: youtu.be/0g9poWKKpbU
$string1 = 'http://www.youtu.be/0g9poWKKpbU';
//Ссылка из плейлиста: youtube.com/watch?v=0g9poWKKpbU&list=SPJuzssrVaWjbIpmb36XabFUkiowJQQ9DH
$string2 = 'http://www.youtube.com/watch?v=0g9poWKKpbU&list=SPJuzssrVaWjbIpmb36XabFUkiowJQQ9DH';  
//Длинная ссылка от встроенного видео на сайте: youtube.com/watch?feature=player_embedded&v=0g9poWKKpbU  
$string3 = 'http://www.youtube.com/watch?feature=player_embedded&v=0g9poWKKpbU';  
 
$pattern =  
        '%^# Match any YouTube URL
        (?:https?://)?  # Optional scheme. Either http or https
        (?:www\.)?      # Optional www subdomain
        (?:             # Group host alternatives
          youtu\.be/    # Either youtu.be,
        | youtube\.com  # or youtube.com
          (?:           # Group path alternatives
            /embed/     # Either /embed/
          | /v/         # or /v/
          | /watch\?v=  # or /watch\?v=
          )             # End path alternatives.
        )               # End host alternatives.
        ([\w-]{10,12})  # Allow 10-12 for 11 char YouTube id.
        $%x'
        ;
$result = preg_match($pattern, $string, $matches);          
 
    
//echo  $matches[1];
print  "<iframe src='http://www.youtube.com/embed/".$matches[1]."?wmode=opaque' type='text/html' width='590' height='332' frameborder='0'></iframe>";
 

Всего записей: 79 | Зарегистр. 26-08-2009 | Отправлено: 23:52 03-06-2013 | Исправлено: n0byk, 00:22 04-06-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
n0byk
да что вы к той регулярке привязались то??

Код:
$strings = array(
'http://www.youtube.com/watch?v=0g9poWKKpbU',
'http://www.youtu.be/0g9poWKKpbU',  
'http://www.youtube.com/watch?v=0g9poWKKpbU&list=SPJuzssrVaWjbIpmb36XabFUkiowJQQ9DH',  
'http://www.youtube.com/watch?feature=player_embedded&v=0g9poWKKpbU'
);
 
foreach($strings as $string) {
    preg_match("/((\/|v=)(\w{10,12}))/Ui" , $string, $result);  
    var_dump($result);  
}

 
если же ссылок куча, не только с youtube, то нужно добавить условие на домен

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 01:22 04-06-2013 | Исправлено: Cheery, 01:25 04-06-2013
n0byk



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

Всего записей: 79 | Зарегистр. 26-08-2009 | Отправлено: 11:40 04-06-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
n0byk
возможно лучше [\w-] вместо \w - не знаю, какие символы бывают в этом id

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 18:36 04-06-2013
n0byk



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Cheery
Странно, обрезает последний символ.
поменял {10,12} на {11,13}
Кажется работает

Всего записей: 79 | Зарегистр. 26-08-2009 | Отправлено: 18:43 06-06-2013
mishakor

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть кусок когда который, при переписке добавлял а затем менял бы в начале темы сообщения "Re[1]: тема сообщения"  
 
есть такой кусочек кода

Код:
 
$reSubject = nc_preg_replace('/^Re[d+].*)$/','Re['.(nc_substr($f_Subject,3)+1).']:$1',$f_Subject);
if ($f_Subject == $reSubject) $reSubject = preg_replace('/^Re.*)$/','Re[2]:$1',$f_Subject);
if ($f_Subject == $reSubject) $reSubject = "Re: $f_Subject";
 

Допустим тема сообщения "test"  
 
когда первый раз на него отвечают получается "Re: test"  
второй раз "Re[2]: test"  
 
а вот на дальнейшую работу скрипт не настроен, начинает всё заново  
"Re: Re[2]: test"  
"Re[2]: Re[2]: test"  
"Re: Re[2]: Re[2]: test"  
и т.д.  
 
Подскажите чем его заменить или что в нём поменять, с регулярками туго  
 
Заранее спасибо.  
 
Добавлено:
в регулярках пробелы понаставил, чтоб смайлов не было
 

Код:
$reSubject = nc_preg_replace('/ ^ Re [ d + ] : ( . * ) $ / ','R e [ * ] : $ 1 ',$f_Subject);  
if($f_Subject == $reSubject) $reSubject = preg_replace('/ ^ Re : ( . * ) $ / ',' Re [ 2 ] : $ 1 ',$f_Subject);  
if($f_Subject == $reSubject) $reSubject = "Re: $f_Subject";

Всего записей: 65 | Зарегистр. 29-09-2008 | Отправлено: 06:45 26-06-2013
Cheery



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

Код:
  $str = 'Re[2]:Test';
  echo preg_replace_callback('/^(Re\[(\d+)\]:|())/', function($re) {
        return 'Re[' . (++$re[2]). ']:';
    }, $str);

 
Там есть лишние скобки, но это лишь для того, чтобы внутри анонимной функции не определять размер массива.
 
И да, работать будет в версии 5.3 и выше (тогда появились анонимные функции)
 
если первый Re нужно без номера (сейчас будет Re[1]:), то  

Код:
  $str = 'Test';
  for ($i = 1; $i < 11; $i++) {
  echo $str . '<br>';
  $str = preg_replace_callback('/^(Re(\[(\d+)\])?:|)/', function($re) {
        if (empty($re[0])) return 'Re:';
        return 'Re[' . (isset($re[3])?(++$re[3]):1). ']:';
    }, $str);
  }

 
Результат:
Цитата:
Test
Re:Test
Re[1]:Test
Re[2]:Test
Re[3]:Test
Re[4]:Test
Re[5]:Test
Re[6]:Test
Re[7]:Test
Re[8]:Test

 
не хотите Re[1]? замените в return 1 на 2

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 07:10 26-06-2013 | Исправлено: Cheery, 07:31 26-06-2013
mishakor

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

Всего записей: 65 | Зарегистр. 29-09-2008 | Отправлено: 07:45 26-06-2013
Kaylang



Вредный и упрямый
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем привет!
 
Кто-нить может накидать регулярное выражение для выделения почтового индекса (5 идущих подряд цифр) из строк типа: "Castello 3839 - 30122 - Venezia - Italia".
Цифры могут быть любыми, но именно 5 штук. В некоторых строках индекса может не быть. Т.е. желательно еще и проверку наличия.
ЗЫ. если не влом, сразу на php.
 
Заранее благодарен!

Всего записей: 38546 | Зарегистр. 29-08-2002 | Отправлено: 16:17 27-06-2013 | Исправлено: Kaylang, 16:56 27-06-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kaylang
\d{5}
 
но это выцепит любые 5 идущих подряд цифр

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:44 27-06-2013
Kaylang



Вредный и упрямый
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery

Цитата:
\d{5}  

Не выцепляет, потому и написал сюда.
 

Код:
 
$my_string = 'Castello 3839 - 30122 - Venezia - Italia';
preg_match('\d{5}',$my_string, $matches)
var_dump($matches);
 

выводит NULL
 
и [0-9] пробовал, и в скобки брал... и еще чего-то делал, счас уже не вспомню.

Всего записей: 38546 | Зарегистр. 29-08-2002 | Отправлено: 22:34 27-06-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kaylang
ну так кто будет правильно записывать регулярку?

Код:
$my_string = 'Castello 3839 - 30122 - Venezia - Italia';  
preg_match('/\d{5}/',$my_string, $matches);  
var_dump($matches);  


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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 23:01 27-06-2013
Kaylang



Вредный и упрямый
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Усе, отбой. Разобрался.
 
Добавлено:
Cheery

Цитата:
preg_match('/\d{5}/',$my_string, $matches);

тока я вместо слешей % поставил.  
 
В любом случае, благодарю!

Всего записей: 38546 | Зарегистр. 29-08-2002 | Отправлено: 23:02 27-06-2013
khakas

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть педагоги тут?
может кто-нибудь толково объяснить, почему для строки типа "blablabla 1990" регексп /([0-9]*)/ ничего не вернет в $1???
 
Ясно-понятно, что сам мач происходит - хоть [0-9] перед * воткни, хоть что. Ясно-понятно, что /(.*)([0-9]*)/ даст нам счастье. Легко проверить, что /([0-9]+)/ даст нам ожидаемые 1990. Но почему тогда *, который логически от + отличается только вариантом "или нифига подобного" отдает нам пустую строку?
 
Уверен - многие на моем месте придумали бы себе объяснение (вопрос-то с виду элементарный) и успокоились, а чувака с таким вопросом заклевали бы. Но я реально хочу понять работу регекспов - шаманов в отрасли и без меня навалом...

Всего записей: 4 | Зарегистр. 15-05-2007 | Отправлено: 16:41 01-07-2013
Cheery



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

Цитата:
"или нифига подобного" отдает нам пустую строку?

потому что под "нифига подобного" попадает все, что идет до цифр..
при использовании preg_match_all - поймете, если посмотрите результат.
 

Код:
  $str = 'blablabla 1990';
  preg_match_all('/(\d*)/', $str, $matches);
  var_dump($matches);

результат

Цитата:
array(2) {
  [0]=>
  array(12) {
    [0]=>
    string(0) ""
    [1]=>
    string(0) ""
    [2]=>
    string(0) ""
    [3]=>
    string(0) ""
    [4]=>
    string(0) ""
    [5]=>
    string(0) ""
    [6]=>
    string(0) ""
    [7]=>
    string(0) ""
    [8]=>
    string(0) ""
    [9]=>
    string(0) ""
    [10]=>
    string(4) "1990"
    [11]=>
    string(0) ""
  }
  [1]=>
  array(12) {
    [0]=>
    string(0) ""
    [1]=>
    string(0) ""
    [2]=>
    string(0) ""
    [3]=>
    string(0) ""
    [4]=>
    string(0) ""
    [5]=>
    string(0) ""
    [6]=>
    string(0) ""
    [7]=>
    string(0) ""
    [8]=>
    string(0) ""
    [9]=>
    string(0) ""
    [10]=>
    string(4) "1990"
    [11]=>
    string(0) ""
  }
}

 
10 символов до цифр, возвращается 10 пустых мест.

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:43 01-07-2013 | Исправлено: Cheery, 20:44 01-07-2013
khakas

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
хмм...  
Вы подразумеваете, что print $1 по факту напечатает $matches[1][11], верно я понял мысль? Т.е. самое ПОСЛЕДНЕЕ совпадение, для которого произошел мач (а он происходит на любой подстроке для *, в отличие от +)
Тогда мне не совсем понятно - после "1990" ведь нет больше символов, откуда берется $mathes[.][11], что сравнивается с шаблоном в 12-й раз ??? Что ДО цифр вернулось 10 пустых мест - это понятно...
 
И - как же жадность?... я ее понимаю так - из всех возможных совпадений с шаблоном берется самое длинное...

Всего записей: 4 | Зарегистр. 15-05-2007 | Отправлено: 23:29 01-07-2013 | Исправлено: khakas, 23:33 01-07-2013
Открыть новую тему     Написать ответ в эту тему

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