Мне нужно регулярное выражение, чтобы получить атрибут src тега img - PullRequest
2 голосов
/ 04 мая 2009

У меня есть строка, которая следует буквально :

"lt;img src=quot;http://www.news.gov.tt/thumbnail.php?file=Hon__Jerry_Narace_Minister__Of_Health_599152837.jpgamp;size=summary_mediumquot;gt;lt;pgt;Fifty-eight people have been tested for Influenza A/H1N1 virus, commonly called swine flu, in Trinidad and Tobago. \r\nThe tests have all come back negative, Health Minister Jerry Narace said yesterday. \r\n\r\n"

Я бы хотел получить URL между "quot;" строки, т. е.

http://www.news.gov.tt/thumbnail.php?file=Hon__Jerry_Narace_Minister__Of_Health_599152837.jpgamp;size=summary_medium

с использованием регулярных выражений в .NET.

Есть идеи?

Ответы [ 4 ]

2 голосов
/ 04 мая 2009
Regex r = new Regex("(?<=img src=&quot;).*?(?=&quot;)");

Должно помочь вам, при условии, что там нет никаких амперсандов, скрывающихся где-то там.

РЕДАКТИРОВАТЬ: После публикации этого ответа я заметил, что амперсанды, которые я видел ранее в вашей строке, больше не присутствовали.

1 голос
/ 05 мая 2009
^\"lt;img\s+src\=quot;(.+)quot;

С учетом следующего ввода:

"lt;img src=quot;http://www.news.gov.tt/thumbnail.php?file=Hon__Jerry_Narace_Minister__Of_Health_599152837.jpgamp;size=summary_mediumquot;gt;lt;pgt;Fifty-eight people have been tested for Influenza A/H1N1 virus, commonly called swine flu, in Trinidad and Tobago. \r\nThe tests have all come back negative, Health Minister Jerry Narace said yesterday. \r\n\r\n"

это регулярное выражение возвращает следующее:

http://www.news.gov.tt/thumbnail.php?file=Hon__Jerry_Narace_Minister__Of_Health_599152837.jpgamp;size=summary_medium

что я считаю именно то, что вам нужно.

Надеюсь, это поможет, Ryan

1 голос
/ 04 мая 2009

Это регулярное выражение должно отсортировать вас, чтобы получить src-содержимое просто тегов IMG:

(?<=<img.*?src=\&quot;)[^\"]*(?=\&quot;.*?((&frasl;&gt;)|(&gt;.*&lt&frasl;img&gt;)))

Он не зависит от расположения или src внутри тега, он требует, чтобы вы установили чувствительность к регистру на нечувствительность, чтобы быть стабильной.

В версии Patjbs вы получите src всех тегов, что приведет к нестабильности, если вы анализируете html, содержащий ссылки во внешнем контенте - таком как javascript, внешнее содержимое div и т. Д.

string htmlString = @"<img id="tagId" src="myTagSource.gif" name="imageName" />";
string matchString = Regex.Match(htmlString, @"(?<=<img.*?src=\")[^\"]*(?=\".*?((/>)|(>.*</img)))").Value;

matchString теперь равно «myTagSource.gif»

Я заметил, что в вашей входной строке отсутствует символ & (амперсанд) для обозначения escape-символов, таких как quot; не будет никакого способа (не заставляя логику искать quot; lt; gt;), чтобы интерпретировать эти символы программно. Вам нужно будет выполнить замену исходной строки, чтобы преобразовать ее в интерпретируемую строку [это слово?].

Итак, допустим, вы вынули все эти строки со страницы, вам нужно было бы предположить, что все экземпляры lt; стать <и все> стать> всем " стать ".

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

В качестве альтернативы, вы могли бы сделать это за один раз, заменив конструкцию html в моем шаблоне соответствующими заменами символов (при условии, что они используют стандартное кодирование, но отбрасывают амперсанд), хотя это не совсем так. как читабельный и может вызвать путаницу у любого, кто поддерживает код:

(= \ Quot; * ((frasl; GT; (<= л;; IMG <em>SRC = \ Quot?.?).?.?.) | (GØ; * л; frasl; imggt;)))

Редактировать: Если окажется, что они являются с использованием стандартной кодировки, а вы просто не предоставили & в вашем примере, тогда вы можете просто sub в первом шаблоне, который я представил, ссылаясь на декодированный URL, используя:

string MatchValue = Regex.Match(HttpUtility.UrlDecode(inputString), pattern).Value;

Это расшифрует строку, которую вы получили от них, в стандартную строку, заменив экранированные символы правильными символами, а затем запустив тот же шаблон.

0 голосов
/ 05 мая 2009

Регулярные выражения в принципе плохо разбирают HTML (см. . Можете ли вы привести некоторые примеры того, почему трудно анализировать XML и HTML с регулярным выражением? , почему). Что вам нужно, это HTML-парсер. См. Можете ли вы привести пример разбора HTML с вашим любимым парсером? для примеров использования различных парсеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...