Поиск в HTML документе ссылок

Dmitr

Новичок
Поиск в HTML документе ссылок

Нужно найти в документе все ссылки на картинки и записать их в массив.
preg_match_all("/img[a-zA-Z0-9\s]+src=([\"a-zA-Z0-9])[>\s]/",$text,$mas);
Что я не так делаю?
 

SelenIT

IT-лунатик :)
Между img и src могут быть не только буквы, цифры и пробелы, но еще как минимум кавычки и знак равенства. Зато там точно не будет закрывающей угловой скобки, так что лучше, наверное, написать [^>]+. Аналогично и в ссылке - там могут быть двоеточия, знак подчерквания, знак процента и т.п., поэтому проще написать, чего там заведомо не будет (пробелов).

Также наверняка понадобятся модификаторы s и i.

И рекомендую поиск по форуму - тема поднимается часто и примеров масса.
 

Dmitr

Новичок
Дописал так:
preg_match_all("/<img[[:print:]]+src=([[:print:]])[>\s]/",$text,$mas);
Толи я чёто не догоняю, даже когда я пишу:
preg_match_all("/<([[:print:]])/",$text,$mas);
то тоже ничего не получается...

-~{}~ 07.08.05 14:29:

Помогите кто нибудь....
 

sage

Новичок
И рекомендую поиск по форуму - тема поднимается часто и примеров масса.
. На самом деле, всё проще простого. Ещё раз перечитай пост SelenIT и помазгуй немного.
 

Dmitr

Новичок
Помазговал, но глухо
PHP:
preg_match_all("/<img[[:print:]]+src=([[:print:]])[>\s]/",$text,$mas);
-~{}~ 07.08.05 17:19:

ого.... испортачило моё сообщение...
 

Dmitr

Новичок
preg_match_all("/<img[ \r\n\t]{1}[^>]*[Ss][Rr][Cc][^=]*=[ '\"\n\r\t]*([^ \"'>\r\n\t#]+)[^>]*>/","$file",$mas);
Вот так запахало :)
Теперь осталось заменить путь на локальный.
preg_replace("/<img[ \r\n\t]{1}[^>]*[Ss][Rr][Cc][^=]*=[ '\"\n\r\t]*([^ \"'>\r\n\t#]+)[^>]*>/","img.jpg",$file);
Чёто и тут не то....
 

master_x

Pitavale XXI wieku
Тебе же сказали, s и i чтобы не было казусов типа [Ss][Rr][Cc]. Если не знаешь, то это модификаторы паттерна, ставятся в самом конце после ограничителя (в твоем случае / )
 

Dmitr

Новичок
поменял:
preg_match_all("/<iframe[ \r\n\t]{1}[^>]*src[^=]*=[ '\"\n\r\t]*([^ \"'>\r\n\t#]+)[^>]*>/im",$file,$mas);
--------------------------
теперь replace: (заменяем путь на локальный отсекаем 'http://.../' оставляем только file.html)
preg_replace("/<iframe[ \r\n\t]{1}[^>]*src[^=]*=[ '\"\n\r\t]*([^ \"'>\r\n\t#]+)[^>]*>/im","$1",$file);
Подправте меня, поиск работает нормально с этим же шаблоном, а замена нет :(
 

SelenIT

IT-лунатик :)
Dmitr
Куда ты сохраняешь результат риплейса? По идее, тебе нужно присвоить его обратно переменной $file.

И пара замечаний по шаблону:
1) Разберись получше с модификаторами и замени ненужный на нужный;
2) Класс [ \r\n\t] можно записать короче в виде метасимвола \s.
 

Dmitr

Новичок
ОГО! затупил я конечно же :)
$file = preg_replace("/(<iframe\s{1}[^>]*src[^=]*=)[ '\"\n\r\t]*[http:\/]*([^ \"'>\r\n\t#]+)([^>]*>)/im","$1\"$2$3",$file);
Заработало, только вот не всё отсекает
<iframe src="server.ua/frame2.html">
а надо
<iframe src="frame2.html">
Думал [/] дописать, не помогает...
 

SelenIT

IT-лунатик :)
Какой смысл в классе [http:\/]?

А вот [ '\"\n\r\t] можно тоже "сократить" в ['\"\s].

И один из модификаторов все еще не тот, что нужен.
 

Dmitr

Новичок
[http:\/] - отсекает http:// если есть, но надо ещё и после отсечь в плоть до имени файла.
------------
$file = preg_replace("/(<iframe\s{1}[^>]*src[^=]*=)['\"\s]*[http:\/]*([^ \"'>\s#]+)([^>]*> )/im","$1\"$2$3",$file);
 

SiMM

Новичок
> [http:\/] - отсекает http:// если есть, но надо ещё и после отсечь в плоть до имени файла.
Ничего подобного она не делает
[m]reference.pcre.pattern.syntax#regexp.reference.squarebrackets[/m] vs [m]reference.pcre.pattern.syntax#regexp.reference.subpatterns[/m]
 

Dmitr

Новичок
Можно так :) [h]*[t]*[t]*[p]*[:]*[\/]*[\/]*
Может подскажете, как одно имя файла оставить?
 

DiTHER

bang bang
элементарная вежливость - [ php ] code [ /php ] - помойму даже в мыслях нет
 

sage

Новичок
Dmitr
это вообще кошмар! лучшее решение - прочитать на деталях и в мане про регулярные выражения.
 

DiTHER

bang bang
Автор оригинала: Dmitr
Можно так :) [h]*[t]*[t]*[p]*[:]*[\/]*[\/]*
Может подскажете, как одно имя файла оставить?
Прежде чем писать регулярные выражения хорошо бы почитать о том "что делает php чтобы обработать такое-то регулярное выражение". Ибо в твоём случае - ему работы - мама не горюй.

-~{}~ 08.08.05 11:58:

sage =)

-~{}~ 08.08.05 12:04:

Smitr, и всем остальным..:

Each powerful thing can brings powerful advantage. No less than the most powerful harm. Than more powerfully the thing that to be cleverer it is necessary to the person to use. (c) Edwin Nollen
 

Dmitr

Новичок
Ладно, тупо мне напишите, а я разберусь...
из <iframe ... ... src="http://domain.com/.../file.html> надо выдрать file.html (может быть и без http)
 

ELLO

Guest
PHP:
preg_match("/<iframe.*?src.*?=.*?\"(http:\/\/|).*\/([^\"]*)\"/is", '<iframe ... ... src="http://domain.com/.../file.html">', $f);
примитивно но работает
 
Сверху