Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Rss ссылка в теле html файла
 
 автор: Sergic   (09.09.2008 в 23:21)   письмо автору
 
 

Возникла такая проблема... есть куча файлов хтмл и нужно их обработать на поиск ссылки rss в каждом файле...
В каждом файлике есть ссылка типа
<link rel="alternate" href="http://site.net/rss/index.xml" type="application/rss+xml" title="Title1" />

Вот какое регулярное выражение построить на то чтобы вытащить от сюда http://site.net/rss/index.xml ???
также эта ссылка может выглядеть так
<link rel='alternate' type='application/rss+xml' title='Title1' href='http://site.net/rss/index.xml'>

тоесть все параметры rel, type, title, href могут быть беспорядочно, но одно точно, что
rel='alternate'
type='application/rss+xml'

помогите, пожалуйста, ато не могу сообразить ничего (((

  Ответить  
 
 автор: AcidTrash   (10.09.2008 в 00:00)   письмо автору
 
   для: Sergic   (09.09.2008 в 23:21)
 

Так нормально
preg_match("!<link.*href=[\"|'](.+?)[\"|'|\s]!i", $text, $out); 

  Ответить  
 
 автор: Sergic   (10.09.2008 в 01:07)   письмо автору
 
   для: AcidTrash   (10.09.2008 в 00:00)
 

!

  Ответить  
 
 автор: xx77   (10.09.2008 в 00:49)   письмо автору
 
   для: Sergic   (09.09.2008 в 23:21)
 

:)
думаю вариантов два

искать link в которых значение атрибута href заканчмвается расширением xml
чем-то таким
'#<link\b[^>]*?\shref=[\'"]?([^\s>\'"]+)(?<=\.xml)[^>]*>#i'


или т.к. не всегда расширение .xml и часто ещё с гет параметрами
искать link'и в которых type='application/rss+xml', и потом анализировать на присутствие rel='...' , если нужно
и извлекать значение href.

искать можно попробовать примерно таким выражением
'#<link\b[^>]*?\stype=["\']?application/rss+xml["\']?[^>]*>#i'

  Ответить  
 
 автор: Sergic   (10.09.2008 в 01:09)   письмо автору
 
   для: xx77   (10.09.2008 в 00:49)
 

спасиб, первое вродь подходит, но вот что...
вобшем получается так: нужно найти элемент который находиться в href=[\"|'](.+?)[\"|'|\s] но учитывая то что есть ещё и type=["\']?application/rss+xml["\'] (которое в свою очередь может быть и перед href и после href или вобше после title, которое после href стоит и т.п.)...
такое возможно?

и еще чем отличаються границы регулярного выражения "!" "/" "#" "|" "%"? ато в примерах я вижу разное

  Ответить  
 
 автор: xx77   (10.09.2008 в 02:34)   письмо автору
 
   для: Sergic   (10.09.2008 в 01:09)
 

Возможно, только замедлит и усложнит выражение
с использованием условных подмасок (?(1)......)
"href" , будет всегда в $2
<?
$h 
'\s+href=[\'"]?([^\s>\'"]+)';
$t'\s+type=["\']?application/rss\+xml';
$n '(?:(?!\s+(?:href|type)=)[^>])*';

$pattern '~<link' "$n($t)?(?(1)$n)$h(?(1)|$n$t)" '[^>]*>~i' ;

preg_match_all($pattern$txt$txt);

print_r($txt); 

или прямым перебором
<?
$pattern 
'~<link' "$n(?:$h$n$t|$t$n$h)" '[^>]*>~i' ;

здесь "href" может быть и в $1 и в $2

В предыдущем посте незаэкранировал в шаблоне + там где application/rss+xml

> чем отличаються границы
В php ничем , ограничители выражения лучше выбирать так,
что-бы по возможности не приходилось экранировать такие-же символы внутри шаблона

  Ответить  
 
 автор: Sergic   (10.09.2008 в 02:36)   письмо автору
 
   для: Sergic   (10.09.2008 в 01:09)
 

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

$str1 = '<link rel="alternate" href="http://site.net/rss/index.xml" type="application/rss+xml" title="Title1" />';

if (preg_match_all('#<link[^>]+type=\s*(?:"|)application/rss\+xml[^>]*>#is', $str1, $matches)) {
  // extract url from each declaration
  foreach ($matches[0] as $raw) {
    if (preg_match('#href=\s*(?:"|)([^"\s>]+)#i', $raw, $url)) {
      echo $url[1].'<br>';
    }
  } 
}


(?:"|) - что это такое??? не могу понять
потом зачем рег.выр заканчиваэться "is" в первом а "і" во втором?
[^"\s>] - что это означает и зачем тут символ > ???


to xx77: спасиба!!! но не реально разобрать )))) тяжол для меня

  Ответить  
 
 автор: xx77   (10.09.2008 в 02:58)   письмо автору
 
   для: Sergic   (10.09.2008 в 02:36)
 

(?:"|) - незахватывающая подмаска ,в которой альтернатива " или ничего
такой-же смысл как "?

[^"\s>]+ - один или более не пробельных и не > символов
набор символов в []-скобках называют классом символов, так-же как \d\D\s\S\w .......

$n = '(?:(?!\s+(?:href|type)=)[^>])*';
в моём шаблоне можно попробовать заменить на
$n = '.*?';

  Ответить  
 
 автор: Sergic   (15.09.2008 в 22:02)   письмо автору
 
   для: xx77   (10.09.2008 в 02:58)
 

Спасибо! Вродь разобрался!

  Ответить  
 
 автор: vitali   (16.09.2008 в 10:59)   письмо автору
 
   для: Sergic   (15.09.2008 в 22:02)
 

Посмотрите на вариант с использованием атомарной группировкой, работает быстрее
Имеем :
$str = '<link rel="alternate" href="http://site.net/rss/index.xml" type="application/rss+xml" title="Title1" />
"<link rel=\'alternate\' type=\'application/rss+xml\' title=\'Title1\' href=\'http://site.net/rss/index.xml\'>';
Разруливаем:
preg_match_all('%<link\s+(?>>)*\b(rel\s*=\s*(?:["\']?)[^"\'>]+)(?:.*?)\b(type\s*=\s*(?:["\']?)[^"\'>]+)(?:.*?)>%si', $str, $out); //берем все Ваши варианты

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования