Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.217.4.206] |
|
Сообщ.
#1
,
|
|
|
Помогите составить регулярное выражение
Для HTML страницы надо получить текст между тегом <p class=”intro”>НАДО ЭТО ПРОЧИТАТЬ</p> Получилось че-то типа string reg_exp = @"(?<=\s*<\s*p\s*class="; reg_exp += "\"intro\""; reg_exp += @">)[\S\s]*</p>"; Но ессно, работает не так как надо. |
Сообщ.
#2
,
|
|
|
можешь воспользоваться таким выражением
<p.*>(?'text'.*)</p> А потом получить Matches и из него Groups Добавлено должно быть где-то так: const string parseStr = "<p.*>(?'text'.*)</p>"; string matchStr= "<p class=”intro”>НАДО ЭТО ПРОЧИТАТЬ</p>"; Regex rx = new Regex(parseStr , RegexOptions.Compiled ); foreach(Match match in rx.Matches(matchStr)) { MessageBox.Show(match.Groups["text"].Value); } PS писал от руки, так что могут быть ошибки |
Сообщ.
#3
,
|
|
|
Цитата GarF1eld @ можешь воспользоваться таким выражением 1)Содержание тега <p class="intro"> таково: <p class="intro"> Бла - Бла Бла ..... </p> Все нормально, он оно находит также и закрывающийся </p>, а он не нужен. А 'text' - это что - параметр? 2)А вот еще тег, с которым проблемы <div class="text"> <p> <b>5353535 543 53 Бла БлаБлаБлаБлаБлаБлаБлаБлаБлаБлаБлаБла</b><br /> БлаБлаБлаБлаБлаБлаБлаБлаБлаБлапосле этого женщины плачут и говорят: «Он переспал со мной, он меня бросил». <p><b> Бла БлаБлаБлаБлаБлаБлаБлаБлаБлаБлаБлаБла</b><br /> БлаБлаБлаБлаБлаБлаБлаБлаБлаБлапос… <p><b>Короче, полно всяких левых тегов и переносов строк.</b><br /> Может быть. Может быть… <p><b>Лялялялял ЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялял ялялялял</b></P> <div> Короче, полно всяких левых тегов и переносов строк. Пробовал <div class="text">(?'textik'[.\n]*)</div> - все равно ниче нет. |
Сообщ.
#4
,
|
|
|
Так что конкретно нужно, чтоб парсило? Я не пойму...
Добавлено если нужно просто убрать все теги, то используй <.*> и заменяй их на пустую строку У меня из такого <div class="text"> <p> <b>5353535 543 53 Бла БлаБлаБлаБлаБлаБлаБлаБлаБлаБлаБлаБла</b><br /> БлаБлаБлаБлаБлаБлаБлаБлаБлаБлапосле этого женщины плачут и говорят: «Он переспал со мной, он меня бросил». <p><b> Бла БлаБлаБлаБлаБлаБлаБлаБлаБлаБлаБлаБла</b><br /> БлаБлаБлаБлаБлаБлаБлаБлаБлаБлапос… <p><b>Короче, полно всяких левых тегов и переносов строк.</b><br /> Может быть. Может быть… <p><b>Лялялялял ЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялял ялялялял</b></P> <div> получилось так: 5353535 543 53 Бла БлаБлаБлаБлаБлаБлаБлаБлаБлаБлаБлаБла БлаБлаБлаБлаБлаБлаБлаБлаБлаБлапосле этого женщины плачут и говорят: «Он переспал со мной, он меня бросил». БлаБлаБлаБлаБлаБлаБлаБлаБлаБлапос… Может быть. Может быть… Лялялялял ЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялялЛялялялял ялялялял Добавлено или можешь использовать два Regex =) Один, чтоб нашел необходимый текст, другой, чтоб заменял. А с лишними пробелами можешь сделать следующее: 1) представить ответ как массив строк(через srting.Split) 2) Обрезать ненужные пробелы. (string.Trim()) 3) Склеить строку обратно. В общем, все зависит от потребностей |
Сообщ.
#5
,
|
|
|
1) Мне нужно прочитать из <p class=”intro”>НАДО ЭТО ПРОЧИТАТЬ</p> - здесб нормально, проблем т к весь текст находиться на одной строке и в нем нет других тегов (например, если бы были <p></p>, то регулярное выражение "узнает" до какого именно </p> надо прочитать?)
2) Мне нужно прочитать из <div class="text"> Прочитать, тут дофига всего, в том числе переводов строк и других тегов тегов </div>. Внутри этого текста может быть вложенные теги div. Тогда как регулярное выражение (<div.*>(?'text'.*)</div>) "узнает" до какого именно </div> надо прочитать? Например <div class="text"> fdsfsfd fdsf fds fds fds fdfs ffffffff <div> fdddddddddd<p> dsada dsa45-305 </p> Цитата GarF1eld @ Так что конкретно нужно, чтоб парсило? Я не пойму.. 54354 543543 </div> <!-- Может оно прочитат до этих пор --> dfsa 43444444444 <div class="text2> dsd 453543 </div> <!-- А может и до сюда --> </div> <!-- Но надо-то прочиать до этого места --> Для тех, кто в танке - [COLOR=red]НАДО ПРОЧИАТЬ ВСЕ, ЧТО НАХОДИТЬСЯ МЕЖДУ ОТКРЫВАЮЩИСЯ <DIV CLASS="TEXT"> И СООТВЕТСТВУЮЩИМ ЕМУ ЗАКРЫВАЮЩИМСЯ </DIV> Кстати, имхо <div.*>(?'text'.*)</div> переводы строк обрабатывать не будет, хотя они есть в тексте между этими тегами |
Сообщ.
#6
,
|
|
|
Чтоб обрабатывались переводы строк, в конструкторе RegexOptions.Multiline.
|
Сообщ.
#7
,
|
|
|
Может проще будет загрузить это все в XmlDocument? Если сайт xhtml конечно....
Добавлено вот файл 1.htm <div id="UpdatePanel1"> <div id="Panel2" style="width:125px;"> <div><input type="submit" name="Button1" value="Button" id="Button1" /></div> <div><select size="4" name="ListBox1" id="ListBox1"></select></div> </div> <input type="submit" name="Button2" value="Button" id="Button2" /> </div> Вот код XmlDocument doc = new XmlDocument(); doc.Load(@"d:\1.htm"); foreach (XmlNode node in doc.SelectNodes("//div")) { MessageBox.Show(node.InnerXml); } и все |
Сообщ.
#8
,
|
|
|
Цитата GarF1eld @ Сайт не xhtml Может проще будет загрузить это все в XmlDocument? Если сайт xhtml конечно. |
Сообщ.
#9
,
|
|
|
Регулярными выражениями в силу особенностей их реализации невозможно правильно обрабатывать сбалансированость открывающих/закрывающих элементов. Обратись в сторону синтаксического анализа.
А вообще, если нужно обрабатывать только указанный формат строк, проще написать код для разборки вручную - скорее всего он будет быстрее РВ |
Сообщ.
#10
,
|
|
|
Тогда всем спасибо, буду дальше мучиться.
|