Для эффективного использования плагина
WebParser в целях получения повторяющихся данных из RSS-ленты или сайта погоды, следует использовать параметр
StringIndex2 .
В мануале про этот параметр можно прочитать следующее:
StringIndex2
Этот параметр используется для
RegExp параметра в Мере, использующую данные из другой Меры
WebParser (т. е. URL-адрес указывает на родительскую меру). В этом случае
StringIndex определяет индекс результата выражения родительской меры, а
StringIndex2 определяет индекс
RegExp выражения (т. е. определяет строку, возвращаемую меру).
Для примера давайте получим некоторые данные со страницы
https://docs.rainmeter.net/
Исходный код этой страницы на момент написания данной статьи выглядел так:
Спойлер (Показать) Цитата:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Rainmeter Docs</title>
<link href="/css/main.css?v=3" rel="stylesheet">
<link rel="shortcut icon" href="//www.rainmeter.net/favicon.ico">
<!--[if lt IE 9]><script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.6/html5shiv.min.js"></script><![endif]-->
</head>
<body>
<div id="wrapper">
<div id="top">
<div class="container">
<a id="logo" href="//rainmeter.net/"></a>
<nav id="nav">
<ul>
<li><a href="//www.rainmeter.net">Home</a>
<li><a href="//www.rainmeter.net/about">About</a>
<li><a href="/" class="active">Docs</a>
<li><a href="//www.rainmeter.net/discover">Discover</a>
<li><a href="//forum.rainmeter.net">Forum</a>
</ul>
</nav>
</div>
</div>
<div class="container">
<div class="row">
<div id="content" class="index">
<div id="index-right">
<h3>Help</h3>
<p>Help is available on <a href="//forum.rainmeter.net/">the forum</a>. Members of the development team and the Rainmeter community offer support and advice on a volunteer basis.
<p>For shorter questions, join the discussion in our IRC chat room. Click <a href="http://webchat.freenode.net/?channels=rainmeter">here</a> to chat in your browser, or use your own IRC client to connect to #rainmeter at irc.freenode.net.
<h3>Contact</h3>
<p>For press inquiries or technical problems with the site or forums, email the development team at <a href="mailto:team@rainmeter.net">team@rainmeter.net</a>. Please do not send Rainmeter or skin support requests to this address; use the forum or chat room instead. Support requests sent to this address will not be answered.
</div>
<div id="index-left">
<h2><a href="/manual/">4.0 Manual</a></h2>
<p>Reference and tutorial material for the current final version of Rainmeter.
<h2><a href="/manual-beta/">4.1 Beta Manual</a></h2>
<p>Reference and tutorial material for the next version of Rainmeter in development.
<h2><a href="/tips/">Tips & Tricks</a></h2>
<p>Suggested methods and solutions for using Rainmeter in the field.
<h2><a href="/snippets/">Snippets</a></h2>
<p>Useful code fragments for running Lua scripts in Rainmeter.
<h2><a href="/developers/">Developers</a></h2>
<p>Information for working with the Rainmeter project source code, creating custom plugins, and interacting with Rainmeter from external applications.
<h2><a href="/history/">Version History</a></h2>
<p>Complete record of changes in each version of Rainmeter.
</div>
</div>
</div>
</div>
<div id="footer-push"></div>
</div>
<script src="/js/main.js?v=4"></script>
</body>
</html>
Код скина, который будем разбирать, выглядит так:
Спойлер (Показать)PHP:[Rainmeter]
Update=1000
DynamicWindowSize=1
[Variables]
Url=https://docs.rainmeter.net
Item=.*<h2>(.*)</h2>
[MeasureSite]
Measure=Plugin
Plugin=WebParser
Url=#Url#
RegExp="(?siU)<title>(.*)</title>#Item##Item##Item#.*"
[MeasureMainTitle]
Measure=Plugin
Plugin=WebParser
Url=[MeasureSite]
StringIndex=1
[MeasureItem1Link]
Measure=Plugin
Plugin=WebParser
Url=[MeasureSite]
RegExp="(?siU)<a (.*)">"
StringIndex=2
StringIndex2=1
Substitute='href="':"#Url#"
[MeasureItem1Title]
Measure=Plugin
Plugin=WebParser
Url=[MeasureSite]
DecodeCharacterReference = 1
RegExp="(?siU)">(.*)</a>"
StringIndex=2
StringIndex2=1
[MeasureItem2Link]
Measure=Plugin
Plugin=WebParser
Url=[MeasureSite]
RegExp="(?siU)<a (.*)">"
StringIndex=3
StringIndex2=1
Substitute='href="':"#Url#"
[MeasureItem2Title]
Measure=Plugin
Plugin=WebParser
Url=[MeasureSite]
DecodeCharacterReference = 1
RegExp="(?siU)">(.*)</a>"
StringIndex=3
StringIndex2=1
[MeasureItem3Link]
Measure=Plugin
Plugin=WebParser
Url=[MeasureSite]
RegExp="(?siU)<a (.*)">"
StringIndex=4
StringIndex2=1
Substitute='href="':"#Url#"
[MeasureItem3Title]
Measure=Plugin
Plugin=WebParser
Url=[MeasureSite]
DecodeCharacterReference = 1
RegExp="(?siU)">(.*)</a>"
StringIndex=4
StringIndex2=1
[MeterMainTitle]
Meter=String
MeasureName=MeasureMainTitle
X=0
Y=0
FontSize=13
FontColor=255,255,255,255
SolidColor=0,0,0,1
StringStyle=Bold
Antialias=1
[MeterItem1Title]
Meter=String
MeasureName=MeasureItem1Title
X=0
Y=10R
W=300
H=35
ClipString=1
FontSize=11
FontColor=255,255,255,255
SolidColor=0,0,0,1
Antialias=1
LeftMouseUpAction=["[MeasureItem1Link]"]
[MeterItem2Title]
Meter=String
MeasureName=MeasureItem2Title
X=0
Y=1R
W=300
H=35
ClipString=1
FontSize=11
FontColor=255,255,255,255
SolidColor=0,0,0,1
Antialias=1
LeftMouseUpAction=["[MeasureItem2Link]"]
[MeterItem3Title]
Meter=String
MeasureName=MeasureItem3Title
X=0
Y=1R
W=300
H=35
ClipString=1
FontSize=11
FontColor=255,255,255,255
SolidColor=0,0,0,1
Antialias=1
LeftMouseUpAction=["[MeasureItem3Link]"]
В результате выполнения этого кода получаем такой результат.
Давайте теперь пошагово разберём, что делает этот код.
Во первых определены две переменные, причем одна из них используется в
RegExp
PHP:[Variables]
Url=https://docs.rainmeter.net
Item=.*<h2>(.*)</h2>
Затем в коде используется плагин
WebParser для получения информации с сайта.
PHP:[MeasureSite]
Measure=Plugin
Plugin=WebParser
Url=#Url#
RegExp="(?siU)<title>(.*)</title>#Item##Item##Item#.*"
В формировании параметра
RegExp использована заранее объявленная переменная
Item. Если эту переменную заменить её значением, то в итоге видим 4 точки захвата кода.
Цитата:
RegExp="(?siU)<title>(.*)</title>.*<h2>(.*)</h2>.*<h2>(.*)</h2>.*<h2>(.*)</h2>.*"
Обратите внимание на одну особенность. Вместо того, что бы сразу разобрать весь сайт на многочисленные
StringIndexes, мы только в первом
StringIndexes сразу получаем результат, а вот в
StringIndexes 2, 3 и 4 захватываем куски сырого кода между тегами
<h2> и
</h2>.
Вот этими кусками сырого кода мы в дальнейшем и займёмся.
PHP:[MeasureItem1Title]
Measure=Plugin
Plugin=WebParser
Url=[MeasureSite]
DecodeCharacterReference = 1
RegExp="(?siU)">(.*)</a>"
StringIndex=2
StringIndex2=1
Мы видим, что снова используется плагин
WebParser, но в качестве параметра
Url используется указание на другую месуру
MeasureSite
В этом случае параметр
StringIndex определяет индекс куска кода, который следует взять из
MeasureSite и уже к этому куску кода применяется свой
RegExp
В результате этого может быть захвачено снова несколько элементов и уже на эти элементы ссылается другой параметр -
StringIndex2
Применительно к конкретному примеру из
MeasureSite будет взят кусок кода с индексом 2 (StringIndex=2) и после поиска будет выбран элемент с индексом 1 (StringIndex2=1).
Следующая месура работает аналогично, но имеет свой
RegExp
PHP:[MeasureItem1Link]
Measure=Plugin
Plugin=WebParser
Url=[MeasureSite]
RegExp="(?siU)<a (.*)">"
StringIndex=2
StringIndex2=1
Substitute='href="':"#Url#"
Аналогично повторим те же операции, но для
StringIndex=3 и
StringIndex=4
В общем можно дать совет использовать плагин
WebParser именно по такой схеме.
Первая, главная месура делает запрос к сайту и захватывает максимально необходимое количество даных (зачастую это может быть вся страница сайта целиком). А затем создаются вспомогательные месуры, которые ссылаются на главную и разбирают её данные. Этим достигается минимум запросов к интернет ресурсу, т.к. при слишком частых запросах сервер может принять работу
WebParser за атаку на ресурс. Так же использование подобной схемы позволяет обойти ограничение в 99
StringIndex для одной месуры.