2013-02-27 2 views
0

Есть ли какой-либо простой способ извлечь этот URL-адрес в bash/или PHP?Bash/PHP extract URL из HTML через regex

http://shop.image-site.com/images/2/format2013/fullies/kju_product.png 

Из этого HTML-кода?

<a href="javascript: open_window_zoom('http://shop.image-site.com/image.php?image=http://shop.image-site.com/images/2/format2013/fullies/kju_product.png&pID=31777&download=kju.png&name=13011 KELLYS Kju: 490mm (19.5&quot;)',550,366);"> 

ответ

2

С Perl'ми вы могли бы сделать матч и захват

perl -n -e 'print "$1\n" if (m/image=(.*?)\&/);' 

Это захватывает все между image= и следующей & и печатает его $1.

Более подробную информацию о регулярных выражениях см perlre или http://www.regular-expressions.info/

+0

+1 для неживого регулярного выражения. – L0j1k

+0

Вы, ребята, рок! Работает как шарм. Это регулярное выражение? Кажется, это проще. Иногда мне нужно регулярное выражение, но его действительно сложно изучить. :) – Adrian

+2

@Adrian Это умение хорошо учиться.Начните с простых регулярных выражений и расширьте их. –

2

В bash, вы можете попробовать следующее:

sed 's/.*image=\(http:\/\/[^&]*\).*/\1/g' 

Обновление:
Раствор выше выполняет замену, а не добычи. Строка, содержащая шаблон (требуемый url), заменяется самим шаблоном. Однако замена не на месте.

+0

Вам действительно нужно соответствовать началу строки и концу строки? – L0j1k

+0

@ L0j1k Я не понял, что вы подразумеваете под сочетанием начала строки и конца строки. Я не использовал '^' или '$' в моем решении. – jitendra

+0

Aloha. Это точно. И если вы собираетесь использовать подстановочное совпадение (которое уничтожит исходные данные, что может не знать об этом, возможно, вы должны * использовать '^' и '$'. Все сводится к жадному совпадению, как сказал Спутник. – L0j1k

1

Какой бы путь вы решили одеть его, вы можете просто разделить с разделителем равным ?image=, а затем разделить второй маркер, вы получите (т.е. result[1]) с простым & разделителем. Первый результат этого раскола - ваш ответ.

Однако, чистое регулярное выражение будет выглядеть примерно так: m#image=(a-z0-9\:/\.\-)&#i. Вы можете взять это регулярное выражение и поместить его туда, где хотите получить результат, сохраненный в $1. Несмотря на то, что многие думают, вам не нужно сопоставлять начало строки и конец строки, чтобы соответствовать результату.

1

Попробуйте сделать это:

xmllint --html --xpath '//a/@href' file://file.html | 
    grep -oP 'image=\Khttp://.*?\.png' 

Вы можете использовать URL вместо локального файла:

http://domain.tld/path 

Или, если вы уже извлекли линию для разбора в переменной $string:

grep -oP 'image=\Khttp://.*?\.png' <<< "$string"