2015-11-06 6 views
0

Мне нужно сопоставить только первое вхождение html-ссылки с атрибутами data-{someData}. Я написал регулярное выражение, как показано ниже:regex to mach первое вхождение ссылки html

\<a\s+(.+)\s+data-\s*(.+)\s*>(.+)<\/a>

и она работает для пайсы в HTML только с одним HTML ссылки как:

SOME TEXT/HTML 
<a href="~/link.aspx?_id=B0B5056BD5984878BEB5C92AF6B74DB3&amp;_z=z" 
    data-dms="{6782B150-F6FA-49E6-A2FF-6D6014470373}" 
    data-targetid="{B0B5056B-D598-4878-BEB5-C92AF6B74DB3}" 
    data-dms-event="Content button">Link1 
</a> 
SOME TEXT/HTML 

, но проблема в том, когда HTML содержит больше ссылок. Затем регулярное выражение соответствует последнему вхождению </a>. Так, используя HTML:

SOME TEXT/HTML 
<a href="~/link.aspx?_id=B0B5056BD5984878BEB5C92AF6B74DB3&amp;_z=z" 
    data-dms="{6782B150-F6FA-49E6-A2FF-6D6014470373}" 
    data-targetid="{B0B5056B-D598-4878-BEB5-C92AF6B74DB3}" 
    data-dms-event="Content button">Link1 
</a> 
SOME TEXT/HTML 
<a href="~/link.aspx?_id=1256272320C4429DAB8A1F40D429C841&amp;_z=z" 
    data-dms="{6782B150-F6FA-49E6-A2FF-6D6014470373}" 
    data-targetid="{12562723-20C4-429D-AB8A-1F40D429C841}" 
    data-dms-event="Content button">Link2 
</a> 
SOME TEXT/HTML 

мне нужно исправить мое регулярное выражение для поиска только:

<a href="~/link.aspx?_id=B0B5056BD5984878BEB5C92AF6B74DB3&amp;_z=z" 
    data-dms="{6782B150-F6FA-49E6-A2FF-6D6014470373}" 
    data-targetid="{B0B5056B-D598-4878-BEB5-C92AF6B74DB3}" 
    data-dms-event="Content button">Link1 
</a> 
+1

Почему вы не используете парсер DOM для разбора HTML? –

ответ

2

Во-первых вы, вы искали другие варианты, чем регулярное выражение? Regexp не является идеальным инструментом для анализа html. Если на вашем языке есть DOM, вы можете извлечь из него необходимый тег.

При этом, если вам нужно использовать регулярное выражение, есть два способа обойти проблему, с которой вы сталкиваетесь.

Первое, и в целом предпочтительное решение должно быть более ограничительным в том, что вы соответствуете. Вместо соответствия любому персонажу с . соответствуют любым законным символам с символьными классами, такими как [^>].

Во-вторых, следует использовать нетерпеливое сопоставление, а не жадное соответствие. Это делается путем добавления ? после ваших квантификаторов. Т.е. заменить + на +? и * с *?. Используя нетерпеливое соответствие, регулярное выражение вернется к найденному первому совпадению, а не к последнему.

+0

Спасибо за советы. Добавление '?' Исправило мою проблему. Я выбрал регулярное выражение, потому что мне нужно запустить этот код только один раз, и я предпочитаю избегать добавления внешних библиотек для обработки DOM. –

Смежные вопросы