|
|
|
| Возникла такая проблема... есть куча файлов хтмл и нужно их обработать на поиск ссылки 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'
|
помогите, пожалуйста, ато не могу сообразить ничего ((( | |
|
|
|
|
|
|
|
для: Sergic
(09.09.2008 в 23:21)
| | Так нормально
preg_match("!<link.*href=[\"|'](.+?)[\"|'|\s]!i", $text, $out);
|
| |
|
|
|
|
|
|
|
для: AcidTrash
(10.09.2008 в 00:00)
| | ! | |
|
|
|
|
|
|
|
для: 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'
|
| |
|
|
|
|
|
|
|
для: xx77
(10.09.2008 в 00:49)
| | спасиб, первое вродь подходит, но вот что...
вобшем получается так: нужно найти элемент который находиться в href=[\"|'](.+?)[\"|'|\s] но учитывая то что есть ещё и type=["\']?application/rss+xml["\'] (которое в свою очередь может быть и перед href и после href или вобше после title, которое после href стоит и т.п.)...
такое возможно?
и еще чем отличаються границы регулярного выражения "!" "/" "#" "|" "%"? ато в примерах я вижу разное | |
|
|
|
|
|
|
|
для: 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 в 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: спасиба!!! но не реально разобрать )))) тяжол для меня | |
|
|
|
|
|
|
|
для: Sergic
(10.09.2008 в 02:36)
| | (?:"|) - незахватывающая подмаска ,в которой альтернатива " или ничего
такой-же смысл как "?
[^"\s>]+ - один или более не пробельных и не > символов
набор символов в []-скобках называют классом символов, так-же как \d\D\s\S\w .......
$n = '(?:(?!\s+(?:href|type)=)[^>])*';
в моём шаблоне можно попробовать заменить на
$n = '.*?'; | |
|
|
|
|
|
|
|
для: xx77
(10.09.2008 в 02:58)
| | Спасибо! Вродь разобрался! | |
|
|
|
|
|
|
|
для: 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); //берем все Ваши варианты | |
|
|
|