Неточный preg_match с шаблоном '.jpg' - PullRequest
0 голосов
/ 19 октября 2011

Я использую preg_match с шаблоном $pattern = '/src="http:\/\/(.*?).jpg"/s'; для захвата URL изображений JPEG с веб-страницы.Однако, это не достаточно точно, поскольку оно также захватывает http://www.domain.com/image.png"> Yadayada <img src="anotherpic.jpg.

В других случаях он захватывает такие вещи, как

http://maps.google.com/maps/api/staticmap?center=42.34,-71.18&amp;path=weight:4|42.338,-71.177|42.338,-71.183|42.342,-71.183|42.342,-71.177|42.338,-71.177&amp;zoom=15&amp;size=335x225&amp;sensor=false" width="280" height="188" alt=""></td></tr> <tr><td height="10"></td></tr></table></td></tr></table></td></tr><tr><td height="10 valign="> </td></tr><tr><td valign="top" background="http://www.coolapartments.info/img/java-footer_bg.jpg

Как улучшить шаблон, чтобы предотвратить нежелательное сопоставление, как в 2 приведенных выше примерах?

Ответы [ 2 ]

3 голосов
/ 19 октября 2011

Замените (.*?).jpg на ([^"]*)\.jpg, чтобы избежать пересечения границы двойной кавычки атрибута src. Это может быть даже более общим с src="([^"]*)\.jpg", без соответствия http.

2 голосов
/ 19 октября 2011

Используйте DOM и этот XPath

//@src[contains(,. '.jpg')]

для соответствия всем атрибутам src элементов, которые где-либо содержат строку ".jpg".

Если атрибут должен заканчиваться на ".jpg", используйте

//@src[substring(., string-length(.) - 4) = '.jpg']

, что эквивалентно функции XPath 2.0.

Основным преимуществом использования DOM и XPath является то, что он будет работать только с атрибутами src, в то время как ваше регулярное выражение совпадает везде. Здесь есть множество примеров использования DOM и XPath:

...