RegExp. Не могу выдрать путь к файлу.

Alexos

Новичок
RegExp. Не могу выдрать путь к файлу.

Здравствуйте. Может у меня поехала крыша под конец дня.. но вот уже полчаса не могу выдрать из текстового блока путь к pdf-файлу.. Сорри за слегка длинноватый текст, но "as it is" что называется. Выводит бред какой то.. не буду приводить то, что выводит, но совсем не то, что нужно.. Что не так в preg_match? Подскажите пожалуйста..
PHP:
<?
 $block =
 "action=\"\" style=\"display:inline;\"><input type=\"hidden\" name=\"item_id\" value=\"AP5300\"><input type=\"hidden\" name=\"vendor_name\" value=\"AP Racing\">
 <input type=\"hidden\" name=\"product_name\" value=\"AP Racing 4-Piston Big Brake Kits\"><td valign=\"top\" style=\"text-align:center; width:30px; height:30px;\"
 bgcolor=\"#ffffff\" valign=\"center\"><img onclick=\"popupPic('/product_images/AP5300.jpg');\" src=\"/product_images/resized/30/AP5300.jpg\"
 onmouseover=\"showtrail('/product_images/AP5300.jpg','','')\" onmouseout=\"hidetrail();\" style=\"cursor:hand;\"></td><td valign=\"top\" width=\"150\"
 nowrap class=\"product_page_part\"><nobr>2002 - 2005 RSX</nobr></td><td valign=\"top\" nowrap class=\"product_page_part\" style=\"width:45px;\" width=\"45\">
 <a target=\"_new\" href=\"/product_files/AP5300~appnotes.txt\" title=\"Application Notes\">
 <img src=\"/images/icons/information.png\" border=\"0\" width=\"16\" height=\"16\" align=\"absmiddle\" style=\"margin:2px;\"></a>
 <a target=\"_new\" href=\"/product_files/AP5300~inst.pdf\" title=\"Installation Instructions\">
 <img src=\"/images/icons/wrench.png\" border=\"0\" width=\"16\" height=\"16\" align=\"absmiddle\" style=\"margin:2px;\"></a>
 <a target=\"_new\" href=\"/product_files/AP5300~profile.pdf\" title=\"Brake Fitment Profile\">
 <img src=\"/images/icons/stop.png\" border=\"0\" width=\"16\" height=\"16\" align=\"absmiddle\" style=\"margin:2px;\"></a></td>
 <td valign=\"top\" width=\"100%\" class=\"product_page_part\">Front Kit - Black Calipers - 2-Piece 13.00\" Cross-Drilled / Slotted Rotors</td>
 <td valign=\"top\" nowrap class=\"product_page_part\" style=\"width:80px;\"><nobr>AP5300</nobr></td>";

 preg_match("/<a target=\"_new\" href=\"(.+?)\" title=\"Brake Fitment Profile\">/si", $block, $matches_pdf);

 print_r($matches_pdf);

?>
 

Alexos

Новичок
для того, чтобы получить путь к файлу и положить его в базу.. т.е. в итоге я должен получить product_files/AP5300~profile.pdf
 

Alkinoy

Начинающий
(.+?) - а это как? любой символ один или более раз ни одного или один раз?
 

Alexos

Новичок
не понял вопрос..
любой символ один или более раз вообще то :)

-~{}~ 16.04.08 18:29:

Вообщем, в $matches_pdf[1] должен вывестись product_files/AP5300~profile.pdf
но этого почему то не происходит.. не понимаю почему :(
 

Alexos

Новичок
Alkinoy
неа.. вопрос - это же типа минимизатор квантификатора, ищет минимальную подходящую строку.. или у меня уже окончательно поехала крыша..
 

Alexos

Новичок
Alkinoy
ну да.. о чем же..

можно так:

preg_match("/<a target=\"_new\" href=\"(.+?)\" title=\"Brake Fitment Profile\">/si", $block, $matches_pdf);


а можно так ещё жадность инвертировать:

preg_match("/<a target=\"_new\" href=\"(.+)\" title=\"Brake Fitment Profile\">/Usi", $block, $matches_pdf);

-~{}~ 16.04.08 22:20:

Так в чем все таки может быть дело? Никто не подскажет?
 

ksnk

прохожий
модификатор s нужно убрать... Правда разумно объяснить что происходит я пока не могу :)
 

Alexos

Новичок
ksnk
----------------------
удаляю.. не то написал
----------------------

Да с данным блоком работает, но.. Сории! Я добавил в блок переводы строк, чтобы не растягивать таблицу форума..
Но оригинальный текстовый блок не содержит переводов и выглядит вот так:
PHP:
$block =
 " action=\"\" style=\"display:inline;\"><input type=\"hidden\" name=\"item_id\" value=\"AP5300\"><input type=\"hidden\" name=\"vendor_name\" value=\"AP Racing\"><input type=\"hidden\" name=\"product_name\" value=\"AP Racing 4-Piston Big Brake Kits\"><td valign=\"top\" style=\"text-align:center; width:30px; height:30px;\" bgcolor=\"#ffffff\" valign=\"center\"><img onclick=\"popupPic('/product_images/AP5300.jpg');\" src=\"/product_images/resized/30/AP5300.jpg\" onmouseover=\"showtrail('/product_images/AP5300.jpg','','')\" onmouseout=\"hidetrail();\" style=\"cursor:hand;\"></td><td valign=\"top\" width=\"150\" nowrap class=\"product_page_part\"><nobr>2002 - 2005 RSX</nobr></td><td valign=\"top\" nowrap class=\"product_page_part\" style=\"width:45px;\" width=\"45\"><a target=\"_new\" href=\"/product_files/AP5300~appnotes.txt\" title=\"Application Notes\"><img src=\"/images/icons/information.png\" border=\"0\" width=\"16\" height=\"16\" align=\"absmiddle\" style=\"margin:2px;\"></a><a target=\"_new\" href=\"/product_files/AP5300~inst.pdf\" title=\"Installation Instructions\"><img src=\"/images/icons/wrench.png\" border=\"0\" width=\"16\" height=\"16\" align=\"absmiddle\" style=\"margin:2px;\"></a><a target=\"_new\" href=\"/product_files/AP5300~profile.pdf\" title=\"Brake Fitment Profile\"><img src=\"/images/icons/stop.png\" border=\"0\" width=\"16\" height=\"16\" align=\"absmiddle\" style=\"margin:2px;\"></a></td><td valign=\"top\" width=\"100%\" class=\"product_page_part\">Front Kit - Black Calipers - 2-Piece 13.00\" Cross-Drilled / Slotted Rotors</td><td valign=\"top\" nowrap class=\"product_page_part\" style=\"width:80px;\"><nobr>AP5300</nobr></td>";
Я делал чистку даже ( $block = str_replace("\r", "", $block); $block = str_replace("\n", "", $block); ).. Все равно не помогает.. Что за бред какой то.. Казалось бы 's' нужен как раз в первом случае, а во втором не нужен.. Но именно с первым блоком работает без 's', а со вторым без переносов и даже принудительно очищенном, не работает ни с ним, ни без него! Я немогу понять это умом! Помогите :)
 

stillwaiting

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

Как вариант:
preg_match("/<a target=\"_new\" href=\"([^\"]+?)\" title=\"Brake Fitment Profile\">/si", $block, $matches_pdf);
 

Alexos

Новичок
stillwaiting
Да точно.. но я никак не могу понять почему нужно обязательно указать, что кроме кавычки.. ведь так (.+?) тоже должно работать! глюк какой то что ли?
 

stillwaiting

Новичок
Я для себя сделал следующий вывод из этого примера: строка, которая возвращается preg_match -ем начинается с одного и того же символа в любом случае (хоть жадный хоть ленивый квантор). Просто если "жадность" включена, то квантор пытается зохавать как можно больше символов (естественно при этом вписаться в шаблон).

Данный пример наглядно показал, что это не одно и то же, что "минимальность". :)
 

Alexos

Новичок
stillwaiting, спасибо.
всегда думал, что "жадность" и, так сказать, "минимальность", абсолютно одно и тоже.. круто :) интересно, об этой разнице где-нибудь вообще написано?
 
Сверху