Вот правильное регулярное выражение:
<A HREF=\".*?\">(?<name>.*?)</A>
Сравните с оригиналом:
<A HREF=\".*\">(?<name>.*)</A>
Проблема заключается в операторах повторения .*
, которые по умолчанию жадные. Жадность означает, что регулярное выражение будет расширяться, насколько это возможно, при поиске совпадения. Это означает, что он будет начинаться с первого <A
и заканчивается последним A>
в строке, пропуская все между ними. Это «все» включает остальные <A...A>
в середине.
Вы должны указать, что операторы повторения ленивы. Вы делаете это, добавляя к ним ?
как .*?
.
P.S. Разбор HTML с помощью регулярных выражений, как известно, плохая идея. Это нормально, если вам нужно быстрое и грязное исправление, но нет необходимости в долгосрочном решении. Добавьте к этому тот факт, что в вашем случае выходные данные будут отличаться для каждого сервера и, вероятно, для каждой версии сервера. Код не является универсально-функциональным. Пожалуйста, рассмотрите другой подход, например, переговоры с сервером напрямую для получения списка каталогов (если у вас, конечно, есть доступ).
И, наконец, несколько забавных тем для чтения:
Разбор HTML Путь Ктулху
RegEx соответствуют открытым тегам, кроме автономных тегов XHTML