PDA

Просмотр полной версии : Правильно ли я выбрал шаблон?


piracy
16.03.2009, 04:28
Фрагмент кода:


<td class="content">
<!-- INDEX1 START -->
<h1>Цементно-песчаная черепица</h1>

Цементно-песчаная черепица
<p>При строительстве коттеджей и......

<!-- INDEX1 END -->
</td>
<td id="right">


Пробовал шаблон:
<td class="content">(.+)</td>\s*<td id="right">

Тексты не нашлись.
В чем может быть дело?

piracy
16.03.2009, 04:49
Если в этом проекте выбор шаблона поставить автоматически, то прога выдергивает текст из тегов <li>
Расширенный фрагмент кода:

<li><a href="/articles/14/430/">Грузоперевозки в контейнерах</a></li>
<li><a href="/articles/5/429/">Механизм управления рольставнями</a></li>
<li><a href="/articles/11/428/">Азбука ремонта: покраска – дело тонкое...</a></li>

<li><a href="/articles/16/427/">Недвижимость за границей: что, как, почём</a></li>
<li><a href="/articles/3/426/">История производства сэндвич панелей</a></li>
</ul>

</td>
<td class="content">
<!-- INDEX1 START -->
<h1>Украшение фасада - сайдинг</h1>

<p>Сайдинг - это пластиковые стеновые панели (ПВХ) для наружной отделки.......</p>
<!-- INDEX1 END -->
</td>
<td id="right">



Результат получается буквально такой:

*Грузоперевозки в контейнерах

*Механизм управления рольставнями

*Азбука ремонта: покраска – дело тонкое...

*Недвижимость за границей: что, как, почём

*История производства сэндвич панелей

Нормальный текст.

Следовательно нужно сделать так, чтобы текст не брался из тегов <li>, либо во вкладке "операции" как-то удалить во всех статьях лишнии строчки.
Как это сделать я пока не понимаю.:(

piracy
16.03.2009, 05:03
Попробовал с другим сайтом.
Указал шаблон.
Тексты не нашлись.
Глюк в проге что ли?

usman
16.03.2009, 10:45
Фрагмент кода:


<td class="content">
<!-- INDEX1 START -->
<h1>Цементно-песчаная черепица</h1>

Цементно-песчаная черепица
<p>При строительстве коттеджей и......

<!-- INDEX1 END -->
</td>
<td id="right">


Пробовал шаблон:
<td class="content">(.+)</td>\s*<td id="right">

Тексты не нашлись.
В чем может быть дело?

Дело может быть в том, что может быть в исходном тексте не по одному пробелу, а по несколько. Например в теге <td class="content"> между td и class два или более пробелов. В таких случаях можете использовать шаблон \s+, обозначающий "один или более пробелов". В результате вы получите вот такой шаблон:
<td\s+class="content">(.+)</td>\s*<td\s+id="right">

Кроме того, желательно использование модификаторов.
(?i) - включает режим игнорирования строчных-заглавных букв
(?-i) - выключает его
(?g) - включает "жадный режим"
(?-g) - выключает его.

Приведу пример жадных захватов. Пусть у нас есть вот такой текст:


<table>
<tr><td class="td">нужный текст</td></tr>
<tr><td class="td">ненужный текст</td></tr>
</table>
Если вы укажете шаблон
<td class="td">(.*)</td>,
то в результат попадут оба текст - и нужный, и ненужный. Если же перед этим шаблоном указать модификатор отключения жадности (?-g), то в результат попадет только нужный текст. Это происходит из-за того, что в "жадном" варианте выражение выгребает весь текст до последнего </td>, тогда как в нежадном варианте - только до первого.

И еще: старайтесь указывать модификатор (?i), так как в исходном тексте могут использоваться большие буквы, которые без этого модификатора не будут найдены.

Кстати, модификаторы можно группировать. Например вот такой модификатор: (?i-g) укажет программе игнорировать регистр букв и использовать нежадный подход к выборке данных.

И еще, старайтесь использовать как можно более близкие (и уникальные) теги. В вашем случае было бы более правильно использовать вот такой шаблон:

<!-- INDEX1 START -->(.*)<!-- INDEX1 END -->Конечно же, такой шаблон подойдет в том случае, когда такая пара встречается в тексте только один раз. И опять же, желательно смотреть на количество пробелов в исходном тексте, чтобы не ломать голову над тем, почему регулярное выражение не работает.

usman
16.03.2009, 10:47
Если в этом проекте выбор шаблона поставить автоматически, то прога выдергивает текст из тегов <li>
Расширенный фрагмент кода:


Результат получается буквально такой:

*Грузоперевозки в контейнерах

*Механизм управления рольставнями

*Азбука ремонта: покраска – дело тонкое...

*Недвижимость за границей: что, как, почём

*История производства сэндвич панелей

Нормальный текст.

Следовательно нужно сделать так, чтобы текст не брался из тегов <li>, либо во вкладке "операции" как-то удалить во всех статьях лишнии строчки.
Как это сделать я пока не понимаю.:(

У меня есть соображения, как пропускать менюшки, сделанные из тегов <li>, так что в будущей версии я все сделаю.

piracy
16.03.2009, 11:28
Спасибо за детальное разъяснение. Попробую.

piracy
16.03.2009, 12:16
\s+ и \s* - есть разница?
С модификатором вид шаблона будет такой:
(?-g)<td class="td">(.*)</td>
Правильно?

piracy
16.03.2009, 12:21
В окне указания шаблона нужно ставить галочку "Шаблон является регулярным выражением"?

piracy
16.03.2009, 12:37
Ничего не получается!!!:confused:
Испробованные шаблоны:

<td\s+class="content">(.+)</td>\s*<td\s+id="right">

<!-- INDEX1 START -->(.*)<!-- INDEX1 END -->

(?i)<!--\s*INDEX1\s*START\s*-->(.*)<!--\s*INDEX1\s*END\s*-->

Сайт: http://www.kroi.ru
Страницы типа: http://www.kroi.ru/articles/1/33/

usman
16.03.2009, 12:37
\s+ и \s* - есть разница?
С модификатором вид шаблона будет такой:
(?-g)<td class="td">(.*)</td>
Правильно?
Да, все верно.
По поводу плюсов и звездочек:
плюс обозначает "один или более символов"
звездочка - "ноль или более символов"

В окне указания шаблона нужно ставить галочку "Шаблон является регулярным выражением"?
Да, обязательно!

piracy
16.03.2009, 12:41
С галочкой тоже ничего не получается!:confused: