Re: AHK: Регулярные выражения
Попробовал и так
RegExMatch(My_text, "<data>(s).+?)</data>", match)
Result := match1
и эдак
RegExMatch(My_text, "<data>s)(.+?)</data>", match)
Result := match1
К сожалению не помогло.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Попробовал и так
RegExMatch(My_text, "<data>(s).+?)</data>", match)
Result := match1
и эдак
RegExMatch(My_text, "<data>s)(.+?)</data>", match)
Result := match1
К сожалению не помогло.
RegExMatch(My_text, "s)<data>(.+?)</data>", match)
Result := match1
А так?
Нет, не находит. Наверное какое-то ограничение на длину Haystack.
Не знаю ограничения, кроме 64 MB, указанного в #MaxMem.
"Тоже сейчас мучаюсь с регулярками. проверяю в Sublime - всё работает. Запускаю AHK - не найдено. Почти целый день убил на это. У меня регулярки не маленькие - спокойно могут перевалить за килобайт и более. Может в этом какое ограничение есть?
+ У меня многострочность. Перепробовал много приставок в начале - не помогают. Обычно должно хватать "m)".
Ещё немного помучаюсь - буду искать обходные пути.
Может кто посмотрит? - я тут положил ahk и текстовый файл с данными. Всё готово к запуску и тесту.
В текстовом файле регулярка должна найти весь текст, кроме своей копии расположенной внизу.
Недавно перебирал програмки для работы с регулярками - и обратил внимание на одну интересную функцию в "Expresso" - возможность создать DLL с уже настроенными функциями регулярок. Делаются эти DLL очень просто и быстро. Как запасной аэродром могут иногда сгодится.
Проверяйте ErrorLevel.
Код 0. Отсутствие ошибок. Значит дело в синтаксисе и ключах. Но тут тёмный лес.
Попробую собрать всё в одну строку и с ней уже работать.
Взял и удалил часть файла - всё заработало. Главное чтобы он не превышал 10 МБайт. Только не припомню где это ограничение могло быть в документации? Файл читал через метод объекта File.Open.
The default value for the limit can be set when PCRE is built; the default default is 10 million
В ahk нет директив изменения PCRE_EXTRA_MATCH_LIMIT, поэтому варианты такие:
• Просить директивы на офф-форуме в Wish List. Также просить сделать передачу подобных PCRE_ERROR_MATCHLIMIT ошибок в ErrorLevel.
• Собрать свою версию ahk из исходников, где установить свои лимиты для библиотеки PCRE
• Как ни парадоксально, подключать PCRE как внешнюю dll
Каким выражением можно надежно получить содержимое "article":"(.*?)", при этом пропуская экранированные кавычки?
str =
(
{"shown":1,"collapsed":0,"actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321869939","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321869939#t1321869939","article":"<img src=\"https://ic.pics.livejournal.com/84699806/4293/4293_300.png\" alt=\"\" title=\"\">","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},
)
msgbox % RegExReplace(str, "s)""article"":""(.+?[^\\])""", "$1")
Так вроде надо: ""(.*?[^\\])"".
У меня так вышло:
(?<=\x22article\x22:\x22).*\x5c\x22>(?=\x22)
Находит: <img src=\"https://ic.pics.livejournal.com/84699806/4293/4293_300.png\" alt=\"\" title=\"\">
Это в том случае, если часть выделенная синим цветом должна предшествовать искомой подстроке.
Если же она должна включаться тогда:
\x22article\x22:\x22.*\x5c\x22>(?=\x22)
Находит: "article":"<img src=\"https://ic.pics.livejournal.com/84699806/4293/4293_300.png\" alt=\"\" title=\"\">
Или так:
str =
(
{"shown":1,"collapsed":0,"actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321869939","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321869939#t1321869939","article":"<img src=\"https://ic.pics.livejournal.com/84699806/4293/4293_300.png\" alt=\"\" title=\"\">","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},
)
msgbox % RegExReplace(str, ".*""article"":""(.+?)(?<!\\)"".*", "$1")
А если строка — полноценный JSON, можно ещё так:
str =
(
{"shown":1,"collapsed":0,"actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321869939","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321869939#t1321869939","article":"<img src=\"https://ic.pics.livejournal.com/84699806/4293/4293_300.png\" alt=\"\" title=\"\">","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"}]}
)
obj := JSON.Parse(str)
MsgBox, % SearchKey(obj, "article")
SearchKey(obj, key) {
for k, v in obj {
if (k = key)
Return v
if IsObject(v) {
res := SearchKey(v, key)
if (res != "")
Return res
}
}
}
class JSON
{
static JS := JSON._GetJScripObject()
Parse(JsonString) {
try oJSON := this.JS.("(" JsonString ")")
catch {
MsgBox, Wrong JsonString!
Return
}
Return this._CreateObject(oJSON)
}
_GetJScripObject() {
VarSetCapacity(tmpFile, ((MAX_PATH := 260) - 14) << !!A_IsUnicode, 0)
DllCall("GetTempFileName", Str, A_Temp, Str, "AHK", UInt, 0, Str, tmpFile)
FileAppend,
(
<component>
<public><method name='eval'/></public>
<script language='JScript'></script>
</component>
), % tmpFile
JS := ObjBindMethod( ComObjGet("script:" . tmpFile), "eval" )
FileDelete, % tmpFile
JSON._AddMethods(JS)
Return JS
}
_AddMethods(ByRef JS) {
JScript =
(
Object.prototype.GetKeys = function () {
var keys = []
for (var k in this)
if (this.hasOwnProperty(k))
keys.push(k)
return keys
}
Object.prototype.IsArray = function () {
var toStandardString = {}.toString
return toStandardString.call(this) == '[object Array]'
}
)
JS.("delete ActiveXObject; delete GetObject;")
JS.(JScript)
}
_CreateObject(ObjJS) {
res := ObjJS.IsArray()
if (res = "")
Return ObjJS
else if (res = -1) {
obj := []
Loop % ObjJS.length
obj[A_Index] := this._CreateObject(ObjJS[A_Index - 1])
}
else if (res = 0) {
obj := {}
keys := ObjJS.GetKeys()
Loop % keys.length
k := keys[A_Index - 1], obj[k] := this._CreateObject(ObjJS[k])
}
Return obj
}
}
У этого варианта минус, то что постоянно создается и удаляется файл.
Через ActiveScript разве нельзя его запустить?
Можно не удалять просто. Можно и через ActiveScript, но так как-то проще.
/*<component>
<public><method name='eval'/></public>
<script language='JScript'></script>
</component>
*/ JS := ComObjGet("script:" . A_ScriptFullPath)
q:="3+4*(6-2)"
MsgBox % JS.eval(q)
Забавно, но сработает, если только скрипт запускается из файла, а не динамически из текста.
Вот так уже не работает:
/*
<component>
<public><method name='eval'/></public>
<script language='JScript'></script>
</component>
*/
str =
(
{"shown":1,"collapsed":0,"actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321869939","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321869939#t1321869939","article":"<img src=\"https://ic.pics.livejournal.com/84699806/4293/4293_300.png\" alt=\"\" title=\"\">","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"}]}
)
MsgBox, % IsObject( ComObjGet("script:" . A_ScriptFullPath) )
Как интересно вы тут пишите)). Как раз ломал голову над извлечением из JSON "непостоянных" элементов.
То есть, в строке — отдельные блоки комментариев, внутри которых, в каком-то из них может присутствовать, к примеру, "userpic":"(.*?)", а в другом комментарии этого элемента может не быть. Пытался извлекать по такому принципу, —
match := "", Pos := 1
While Pos := RegExMatch(a, "s)""shown"":[^\R]*(""userpic"":""[^""]*"")?[^\R]*(""uname"":"".*?[^\\]"")?[^\R]*(""commenter_journal_base"":""[^""]*"")?[^\R]*(""dtalkid"":\d+)?[^\R]*(""upictitle"":"".*?[^\\]"")?[^\R]*(""article"":"".*?[^\\]"")?[^\R]*(""ctime"":""[^""]*"")?[^\R]*(""userhead_url"":""[^""]*"")?[^\R]*(""dname"":""[^\R]*[^\\]"")?[^\R]*",match,Pos+StrLen(match))
{
y_cmts .= match1 "`n" match2 "`n" match3 "`n" match4 "`n" match5 "`n" match6 "`n" match7 "`n" match8 "`n" match9 "`n"
MsgBox % y_cmts
}
но так и не понял, как в этой конструкции игнорировать возможные элементы.
Можно ли при такой задаче извлекать из JSON следующие значения элементов для каждого комментария, независимо от их наличия в строке — для вставки в шаблон с тегами?
"userpic"
"uname"
"commenter_journal_base"
"dtalkid":
"upictitle"
"article"
"ctime"
"userhead_url"
"dname"
Вот так уже не работает:
Да, если в коде присутствует знак "<" не срабатывает.
;<component><public><method name='eval'/></public><script language='JScript'></script></component>
JS := ComObjGet("script:" . A_ScriptFullPath)
if (a= "<")
msgbox
Можно ли при такой задаче извлекать из JSON следующие значения элементов для каждого комментария, независимо от их наличия в строке — для вставки в шаблон с тегами?
Я не совсем понял задачу. Мой последний код вроде работает же? Если есть ключ — показывает значение, если нет — пустое.
В смысле, как осуществить перебор выбранных значений для каждого отдельного комментария? Ниже я увеличил количество ключей, но затрудняюсь сделать переход от объекта к объекту (от одного отдельно блока с комментарием — к другому):
str =
(
{"replycount":173,"comments":[{"collapsed":0,"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/125166311/76306440","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321676147","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","name":"expand","title":"Развернуть"}],"uname":"leyb_bronshteyn","loaded":1,"p_tracked":0,"commenter_journal_base":"https://leyb-bronshteyn.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321676147,"talkid":5162797,"thread_url":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","above":1321663091,"upictitle":"leyb_bronshteyn: trotsky","article":"КОММЕНТАРИЙ1","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321676147&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 17:12:32 UTC","parent":1321663091,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://leyb-bronshteyn.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"leyb_bronshteyn","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"leyb_bronshteyn","user_alias":"","profile_url":"https://leyb-bronshteyn.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"leyb_bronshteyn","ctime_ts":1530378752,"is_best":0,"tracked":0},{"shown":0,"collapsed":1,"uname":"","loaded":0,"p_tracked":0,"commenter_journal_base":"","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321677683,"talkid":5162803,"thread_url":"https://livejournal.com/2796915.html?thread=1321677683#t1321677683","above":1321676147,"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","below":1321699955,"parent":1321676147,"massactions":1,"deleted":1,"is_promo":0,"dname":"","ctime_ts":1530378800,"leafclass":"deleted","is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/121339544/65211451","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321846131","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","name":"expand","title":"Развернуть"}],"uname":"ext_2042553","loaded":1,"p_tracked":0,"commenter_journal_base":"http://my.mail.ru/list/iwasko/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321846131,"talkid":5163461,"thread_url":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","above":1321806195,"upictitle":"Иван Пирогов: pic#121339544","article":"КОММЕНТАРИЙ2","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321846131&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"3 дня назад","ctime":"1 июля 2018, 16:26:49 UTC","parent":1321806195,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"http://my.mail.ru/list/iwasko/","striked":null,"journaltype":"I","userhead_url":"https://l-stat.livejournal.net/img/mailru-profile.gif?v=12149?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"Иван Пирогов","inline_css":0,"attrs":null,"is_identity":1,"bold":1,"show_userhead":1,"username":"ext_2042553","user_alias":"","profile_url":"https://www.livejournal.com/profile?userid=65211451&t=I","alias":0}],"is_promo":0,"dname":"Иван Пирогов","ctime_ts":1530462409,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321712499","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","name":"expand","title":"Развернуть"}],"uname":"v_unitaz","loaded":1,"p_tracked":0,"commenter_journal_base":"https://v-unitaz.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321712499,"talkid":5162939,"thread_url":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","above":1321677683,"upictitle":"v_unitaz: pic#0","article":"КОММЕНТАРИЙ3","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321712499&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 19:08:18 UTC","parent":1321677683,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://v-unitaz.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"v_unitaz","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"v_unitaz","user_alias":"","profile_url":"https://v-unitaz.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"v_unitaz","ctime_ts":1530385698,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/127834290/83644284","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321713779","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","name":"expand","title":"Развернуть"}],"uname":"lovelement","loaded":1,"p_tracked":0,"commenter_journal_base":"https://lovelement.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321713779,"talkid":5162944,"thread_url":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","above":1321712499,"upictitle":"lovelement: pic#127834290","article":"КОММЕНТАРИЙ4","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321713779&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","below":1321768563,"ctime":"30 июня 2018, 19:15:49 UTC","parent":1321712499,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://lovelement.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"lovelement","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"lovelement","user_alias":"","profile_url":"https://lovelement.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"lovelement","ctime_ts":1530386149,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321720435","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","name":"expand","title":"Развернуть"}],"uname":"v_unitaz","loaded":1,"p_tracked":0,"commenter_journal_base":"https://v-unitaz.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321720435,"talkid":5162970,"thread_url":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","above":1321713779,"upictitle":"v_unitaz: pic#0","article":"КОММЕНТАРИЙ5","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321720435&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 20:29:16 UTC","parent":1321713779,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://v-unitaz.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"v_unitaz","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"v_unitaz","user_alias":"","profile_url":"https://v-unitaz.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"v_unitaz","ctime_ts":1530390556,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/127834290/83644284","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321720691","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","name":"expand","title":"Развернуть"}],"uname":"lovelement","loaded":1,"p_tracked":0,"commenter_journal_base":"https://lovelement.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321720691,"talkid":5162971,"thread_url":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","above":1321720435,"upictitle":"lovelement: pic#127834290","article":"КОММЕНТАРИЙ6","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321720691&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 20:35:06 UTC","parent":1321720435,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://lovelement.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"lovelement","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"lovelement","user_alias":"","profile_url":"https://lovelement.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"lovelement","ctime_ts":1530390906,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/82196355/5817510","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321717619","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","name":"expand","title":"Развернуть"}],"uname":"poulsam","loaded":1,"p_tracked":0,"commenter_journal_base":"https://poulsam.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321717619,"talkid":5162959,"thread_url":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","above":1321695859,"upictitle":"Poul: pic#82196355","article":"КОММЕНТАРИЙ7","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321717619&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 19:47:49 UTC","parent":1321650291,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://poulsam.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"poulsam","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"poulsam","user_alias":"","profile_url":"https://poulsam.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"poulsam","ctime_ts":1530388069,"is_best":0,"tracked":0}]}
)
obj := JSON.Parse(str)
userpic := SearchKey(obj, "userpic")
uname := SearchKey(obj, "uname")
commenter_journal_base := SearchKey(obj, "commenter_journal_base")
dtalkid := SearchKey(obj, "dtalkid")
upictitle := SearchKey(obj, "upictitle")
article := SearchKey(obj, "article")
ctime := SearchKey(obj, "ctime")
userhead_url := SearchKey(obj, "userhead_url")
dname := SearchKey(obj, "dname")
msgbox %userpic%`n%uname%`n%commenter_journal_base%`n%dtalkid%`n%upictitle%`n%article%`n%ctime%`n%userhead_url%`n%dname%
SearchKey(obj, key) {
for k, v in obj {
if (k = key)
Return v
if IsObject(v) {
res := SearchKey(v, key)
if (res != "")
Return res
}
}
}
class JSON
{
static JS := JSON._GetJScripObject()
Parse(JsonString) {
try oJSON := this.JS.("(" JsonString ")")
catch {
MsgBox, Wrong JsonString!
Return
}
Return this._CreateObject(oJSON)
}
_GetJScripObject() {
VarSetCapacity(tmpFile, (MAX_PATH := 260) << !!A_IsUnicode, 0)
DllCall("GetTempFileName", Str, A_Temp, Str, "AHK", UInt, 0, Str, tmpFile)
FileAppend,
(
<component>
<public><method name='eval'/></public>
<script language='JScript'></script>
</component>
), % tmpFile
JS := ObjBindMethod( ComObjGet("script:" . tmpFile), "eval" )
FileDelete, % tmpFile
JSON._AddMethods(JS)
Return JS
}
_AddMethods(ByRef JS) {
JScript =
(
Object.prototype.GetKeys = function () {
var keys = []
for (var k in this)
if (this.hasOwnProperty(k))
keys.push(k)
return keys
}
Object.prototype.IsArray = function () {
var toStandardString = {}.toString
return toStandardString.call(this) == '[object Array]'
}
)
JS.("delete ActiveXObject; delete GetObject;")
JS.(JScript)
}
_CreateObject(ObjJS) {
res := ObjJS.IsArray()
if (res = "")
Return ObjJS
else if (res = -1) {
obj := []
Loop % ObjJS.length
obj[A_Index] := this._CreateObject(ObjJS[A_Index - 1])
}
else if (res = 0) {
obj := {}
keys := ObjJS.GetKeys()
Loop % keys.length
k := keys[A_Index - 1], obj[k] := this._CreateObject(ObjJS[k])
}
Return obj
}
}
str =
(
{"replycount":173,"comments":[{"collapsed":0,"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/125166311/76306440","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321676147","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","name":"expand","title":"Развернуть"}],"uname":"leyb_bronshteyn","loaded":1,"p_tracked":0,"commenter_journal_base":"https://leyb-bronshteyn.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321676147,"talkid":5162797,"thread_url":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","above":1321663091,"upictitle":"leyb_bronshteyn: trotsky","article":"КОММЕНТАРИЙ1","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321676147&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 17:12:32 UTC","parent":1321663091,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://leyb-bronshteyn.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"leyb_bronshteyn","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"leyb_bronshteyn","user_alias":"","profile_url":"https://leyb-bronshteyn.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"leyb_bronshteyn","ctime_ts":1530378752,"is_best":0,"tracked":0},{"shown":0,"collapsed":1,"uname":"","loaded":0,"p_tracked":0,"commenter_journal_base":"","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321677683,"talkid":5162803,"thread_url":"https://livejournal.com/2796915.html?thread=1321677683#t1321677683","above":1321676147,"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","below":1321699955,"parent":1321676147,"massactions":1,"deleted":1,"is_promo":0,"dname":"","ctime_ts":1530378800,"leafclass":"deleted","is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/121339544/65211451","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321846131","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","name":"expand","title":"Развернуть"}],"uname":"ext_2042553","loaded":1,"p_tracked":0,"commenter_journal_base":"http://my.mail.ru/list/iwasko/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321846131,"talkid":5163461,"thread_url":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","above":1321806195,"upictitle":"Иван Пирогов: pic#121339544","article":"КОММЕНТАРИЙ2","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321846131&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"3 дня назад","ctime":"1 июля 2018, 16:26:49 UTC","parent":1321806195,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"http://my.mail.ru/list/iwasko/","striked":null,"journaltype":"I","userhead_url":"https://l-stat.livejournal.net/img/mailru-profile.gif?v=12149?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"Иван Пирогов","inline_css":0,"attrs":null,"is_identity":1,"bold":1,"show_userhead":1,"username":"ext_2042553","user_alias":"","profile_url":"https://www.livejournal.com/profile?userid=65211451&t=I","alias":0}],"is_promo":0,"dname":"Иван Пирогов","ctime_ts":1530462409,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321712499","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","name":"expand","title":"Развернуть"}],"uname":"v_unitaz","loaded":1,"p_tracked":0,"commenter_journal_base":"https://v-unitaz.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321712499,"talkid":5162939,"thread_url":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","above":1321677683,"upictitle":"v_unitaz: pic#0","article":"КОММЕНТАРИЙ3","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321712499&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 19:08:18 UTC","parent":1321677683,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://v-unitaz.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"v_unitaz","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"v_unitaz","user_alias":"","profile_url":"https://v-unitaz.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"v_unitaz","ctime_ts":1530385698,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/127834290/83644284","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321713779","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","name":"expand","title":"Развернуть"}],"uname":"lovelement","loaded":1,"p_tracked":0,"commenter_journal_base":"https://lovelement.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321713779,"talkid":5162944,"thread_url":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","above":1321712499,"upictitle":"lovelement: pic#127834290","article":"КОММЕНТАРИЙ4","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321713779&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","below":1321768563,"ctime":"30 июня 2018, 19:15:49 UTC","parent":1321712499,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://lovelement.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"lovelement","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"lovelement","user_alias":"","profile_url":"https://lovelement.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"lovelement","ctime_ts":1530386149,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321720435","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","name":"expand","title":"Развернуть"}],"uname":"v_unitaz","loaded":1,"p_tracked":0,"commenter_journal_base":"https://v-unitaz.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321720435,"talkid":5162970,"thread_url":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","above":1321713779,"upictitle":"v_unitaz: pic#0","article":"КОММЕНТАРИЙ5","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321720435&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 20:29:16 UTC","parent":1321713779,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://v-unitaz.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"v_unitaz","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"v_unitaz","user_alias":"","profile_url":"https://v-unitaz.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"v_unitaz","ctime_ts":1530390556,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/127834290/83644284","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321720691","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","name":"expand","title":"Развернуть"}],"uname":"lovelement","loaded":1,"p_tracked":0,"commenter_journal_base":"https://lovelement.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321720691,"talkid":5162971,"thread_url":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","above":1321720435,"upictitle":"lovelement: pic#127834290","article":"КОММЕНТАРИЙ6","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321720691&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 20:35:06 UTC","parent":1321720435,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://lovelement.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"lovelement","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"lovelement","user_alias":"","profile_url":"https://lovelement.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"lovelement","ctime_ts":1530390906,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/82196355/5817510","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321717619","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","name":"expand","title":"Развернуть"}],"uname":"poulsam","loaded":1,"p_tracked":0,"commenter_journal_base":"https://poulsam.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321717619,"talkid":5162959,"thread_url":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","above":1321695859,"upictitle":"Poul: pic#82196355","article":"КОММЕНТАРИЙ7","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321717619&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 19:47:49 UTC","parent":1321650291,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://poulsam.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"poulsam","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"poulsam","user_alias":"","profile_url":"https://poulsam.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"poulsam","ctime_ts":1530388069,"is_best":0,"tracked":0}]}
)
obj := JSON.Parse(str)
keys =
(
userpic
uname
commenter_journal_base
dtalkid
upictitle
article
ctime
userhead_url
dname
)
Loop, parse, keys, `n, `r
MsgBox, % SearchKey(obj, A_LoopField)
SearchKey(obj, key) {
for k, v in obj {
if (k = key)
Return v
if IsObject(v) {
res := SearchKey(v, key)
if (res != "")
Return res
}
}
}
class JSON
{
static JS := JSON._GetJScripObject()
Parse(JsonString) {
try oJSON := this.JS.("(" JsonString ")")
catch {
MsgBox, Wrong JsonString!
Return
}
Return this._CreateObject(oJSON)
}
_GetJScripObject() {
VarSetCapacity(tmpFile, (MAX_PATH := 260) << !!A_IsUnicode, 0)
DllCall("GetTempFileName", Str, A_Temp, Str, "AHK", UInt, 0, Str, tmpFile)
FileAppend,
(
<component>
<public><method name='eval'/></public>
<script language='JScript'></script>
</component>
), % tmpFile
JS := ObjBindMethod( ComObjGet("script:" . tmpFile), "eval" )
FileDelete, % tmpFile
JSON._AddMethods(JS)
Return JS
}
_AddMethods(ByRef JS) {
JScript =
(
Object.prototype.GetKeys = function () {
var keys = []
for (var k in this)
if (this.hasOwnProperty(k))
keys.push(k)
return keys
}
Object.prototype.IsArray = function () {
var toStandardString = {}.toString
return toStandardString.call(this) == '[object Array]'
}
)
JS.("delete ActiveXObject; delete GetObject;")
JS.(JScript)
}
_CreateObject(ObjJS) {
res := ObjJS.IsArray()
if (res = "")
Return ObjJS
else if (res = -1) {
obj := []
Loop % ObjJS.length
obj[A_Index] := this._CreateObject(ObjJS[A_Index - 1])
}
else if (res = 0) {
obj := {}
keys := ObjJS.GetKeys()
Loop % keys.length
k := keys[A_Index - 1], obj[k] := this._CreateObject(ObjJS[k])
}
Return obj
}
}
Так?
teadrinker, имелся в виду перебор группой. То есть, требуется разом перебирать ту группу ключей, что я выше в примере собрал в msgbox`е, чтобы эти ключи последовательно искались и выводились группой в пределах комментария. В строке, вместе с удалённым — 8 блоков комментариев (граница каждого начинается с ключа "shown":) и надо выводить те из перечисленных ключей, которые присутствуют в каждом из этих блоков.
Иначе говоря, переход к первому блоку комментария — выводятся имеющиеся в блоке значения ключей (независимо от того, представлены они там все, или нет):
userpic
uname
commenter_journal_base
dtalkid
upictitle
article
ctime
userhead_url
dname
Потом переход ко второму блоку комментария и так же групповой вывод присутствующих в нём ключей, и т.д.
Мне нужен такой формат вывода, чтобы потом разом подставить эти значения ключей — в шаблон комментария с тегами, тогда как при выводе значений ключей по одному это не получится. Типа этого:
y_cmts .= "`n<div class=""comment"">`n<img class=""img"" src=""" match3 """>`n<div class=""info""><a href=""" match4 """>" match2 "</a> – " match7 "<span class=""vote"">" match6 "</span></div>`n<div class=""content"">" match5 "</div>`n</div>`n`n"
Типа этого
Вообще не понимаю, о чём речь. Если нужно перебрать все "блоки", то так:
str =
(
{"replycount":173,"comments":[{"collapsed":0,"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/125166311/76306440","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321676147","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","name":"expand","title":"Развернуть"}],"uname":"leyb_bronshteyn","loaded":1,"p_tracked":0,"commenter_journal_base":"https://leyb-bronshteyn.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321676147,"talkid":5162797,"thread_url":"https://livejournal.com/2796915.html?thread=1321676147#t1321676147","above":1321663091,"upictitle":"leyb_bronshteyn: trotsky","article":"КОММЕНТАРИЙ1","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321676147&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 17:12:32 UTC","parent":1321663091,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://leyb-bronshteyn.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"leyb_bronshteyn","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"leyb_bronshteyn","user_alias":"","profile_url":"https://leyb-bronshteyn.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"leyb_bronshteyn","ctime_ts":1530378752,"is_best":0,"tracked":0},{"shown":0,"collapsed":1,"uname":"","loaded":0,"p_tracked":0,"commenter_journal_base":"","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321677683,"talkid":5162803,"thread_url":"https://livejournal.com/2796915.html?thread=1321677683#t1321677683","above":1321676147,"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","below":1321699955,"parent":1321676147,"massactions":1,"deleted":1,"is_promo":0,"dname":"","ctime_ts":1530378800,"leafclass":"deleted","is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/121339544/65211451","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321846131","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","name":"expand","title":"Развернуть"}],"uname":"ext_2042553","loaded":1,"p_tracked":0,"commenter_journal_base":"http://my.mail.ru/list/iwasko/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321846131,"talkid":5163461,"thread_url":"https://livejournal.com/2796915.html?thread=1321846131#t1321846131","above":1321806195,"upictitle":"Иван Пирогов: pic#121339544","article":"КОММЕНТАРИЙ2","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321846131&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"3 дня назад","ctime":"1 июля 2018, 16:26:49 UTC","parent":1321806195,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"http://my.mail.ru/list/iwasko/","striked":null,"journaltype":"I","userhead_url":"https://l-stat.livejournal.net/img/mailru-profile.gif?v=12149?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"Иван Пирогов","inline_css":0,"attrs":null,"is_identity":1,"bold":1,"show_userhead":1,"username":"ext_2042553","user_alias":"","profile_url":"https://www.livejournal.com/profile?userid=65211451&t=I","alias":0}],"is_promo":0,"dname":"Иван Пирогов","ctime_ts":1530462409,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321712499","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","name":"expand","title":"Развернуть"}],"uname":"v_unitaz","loaded":1,"p_tracked":0,"commenter_journal_base":"https://v-unitaz.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321712499,"talkid":5162939,"thread_url":"https://livejournal.com/2796915.html?thread=1321712499#t1321712499","above":1321677683,"upictitle":"v_unitaz: pic#0","article":"КОММЕНТАРИЙ3","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321712499&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 19:08:18 UTC","parent":1321677683,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://v-unitaz.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"v_unitaz","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"v_unitaz","user_alias":"","profile_url":"https://v-unitaz.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"v_unitaz","ctime_ts":1530385698,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/127834290/83644284","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321713779","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","name":"expand","title":"Развернуть"}],"uname":"lovelement","loaded":1,"p_tracked":0,"commenter_journal_base":"https://lovelement.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321713779,"talkid":5162944,"thread_url":"https://livejournal.com/2796915.html?thread=1321713779#t1321713779","above":1321712499,"upictitle":"lovelement: pic#127834290","article":"КОММЕНТАРИЙ4","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321713779&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","below":1321768563,"ctime":"30 июня 2018, 19:15:49 UTC","parent":1321712499,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://lovelement.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"lovelement","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"lovelement","user_alias":"","profile_url":"https://lovelement.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"lovelement","ctime_ts":1530386149,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321720435","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","name":"expand","title":"Развернуть"}],"uname":"v_unitaz","loaded":1,"p_tracked":0,"commenter_journal_base":"https://v-unitaz.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321720435,"talkid":5162970,"thread_url":"https://livejournal.com/2796915.html?thread=1321720435#t1321720435","above":1321713779,"upictitle":"v_unitaz: pic#0","article":"КОММЕНТАРИЙ5","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321720435&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 20:29:16 UTC","parent":1321713779,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://v-unitaz.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"v_unitaz","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"v_unitaz","user_alias":"","profile_url":"https://v-unitaz.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"v_unitaz","ctime_ts":1530390556,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/127834290/83644284","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321720691","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","name":"expand","title":"Развернуть"}],"uname":"lovelement","loaded":1,"p_tracked":0,"commenter_journal_base":"https://lovelement.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321720691,"talkid":5162971,"thread_url":"https://livejournal.com/2796915.html?thread=1321720691#t1321720691","above":1321720435,"upictitle":"lovelement: pic#127834290","article":"КОММЕНТАРИЙ6","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321720691&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 20:35:06 UTC","parent":1321720435,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://lovelement.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"lovelement","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"lovelement","user_alias":"","profile_url":"https://lovelement.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"lovelement","ctime_ts":1530390906,"is_best":0,"tracked":0},{"shown":1,"collapsed":0,"userpic":"https://l-userpic.livejournal.com/82196355/5817510","actions":[{"allowed":1,"href":"https://livejournal.com/2796915.html?replyto=1321717619","name":"reply","title":"Ответить","footer":1},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","name":"permalink","title":"ссылка"},{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","name":"collapse","title":"Свернуть"},{"allowed":1,"href":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","name":"expand","title":"Развернуть"}],"uname":"poulsam","loaded":1,"p_tracked":0,"commenter_journal_base":"https://poulsam.livejournal.com/","statprefix":"https://l-stat.livejournal.net","lj_statprefix":"https://l-stat.livejournal.net","dtalkid":1321717619,"talkid":5162959,"thread_url":"https://livejournal.com/2796915.html?thread=1321717619#t1321717619","above":1321695859,"upictitle":"Poul: pic#82196355","article":"КОММЕНТАРИЙ7","controls":[{"checkbox":1,"allowed":1,"name":"checkbox","title":"Выбрать"},{"allowed":1,"href":"https://www.livejournal.com/manage/subscriptions/comments.bml?talkid=1321717619&journal=jour","name":"track","title":"Отслеживать"}],"siteroot":"https://www.livejournal.com","poster":"tema","stime":"4 дня назад","ctime":"30 июня 2018, 19:47:49 UTC","parent":1321650291,"massactions":1,"subject":"","deleted":0,"username":[{"journal_url":"https://poulsam.livejournal.com/","striked":null,"journaltype":"P","userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=257.1","color":null,"noctxpopup":0,"side_alias":0,"journal":"poulsam","inline_css":0,"attrs":null,"is_identity":0,"bold":1,"show_userhead":1,"username":"poulsam","user_alias":"","profile_url":"https://poulsam.livejournal.com/profile","alias":0}],"is_promo":0,"dname":"poulsam","ctime_ts":1530388069,"is_best":0,"tracked":0}]}
)
obj := JSON.Parse(str)
keys =
(
userpic
uname
commenter_journal_base
dtalkid
upictitle
article
ctime
userhead_url
dname
)
for k, v in obj.comments {
Loop, parse, keys, `n, `r
%A_LoopField%%k% := SearchKey(v, A_LoopField)
}
MsgBox, % userpic1 . "`n" . userpic2 . "`n" . userpic3
MsgBox, % uname1 . "`n" . uname2 . "`n" . uname3
SearchKey(obj, key) {
for k, v in obj {
if (k = key)
Return v
if IsObject(v) {
res := SearchKey(v, key)
if (res != "")
Return res
}
}
}
class JSON
{
static JS := JSON._GetJScripObject()
Parse(JsonString) {
try oJSON := this.JS.("(" JsonString ")")
catch {
MsgBox, Wrong JsonString!
Return
}
Return this._CreateObject(oJSON)
}
_GetJScripObject() {
VarSetCapacity(tmpFile, (MAX_PATH := 260) << !!A_IsUnicode, 0)
DllCall("GetTempFileName", Str, A_Temp, Str, "AHK", UInt, 0, Str, tmpFile)
FileAppend,
(
<component>
<public><method name='eval'/></public>
<script language='JScript'></script>
</component>
), % tmpFile
JS := ObjBindMethod( ComObjGet("script:" . tmpFile), "eval" )
FileDelete, % tmpFile
JSON._AddMethods(JS)
Return JS
}
_AddMethods(ByRef JS) {
JScript =
(
Object.prototype.GetKeys = function () {
var keys = []
for (var k in this)
if (this.hasOwnProperty(k))
keys.push(k)
return keys
}
Object.prototype.IsArray = function () {
var toStandardString = {}.toString
return toStandardString.call(this) == '[object Array]'
}
)
JS.("delete ActiveXObject; delete GetObject;")
JS.(JScript)
}
_CreateObject(ObjJS) {
res := ObjJS.IsArray()
if (res = "")
Return ObjJS
else if (res = -1) {
obj := []
Loop % ObjJS.length
obj[A_Index] := this._CreateObject(ObjJS[A_Index - 1])
}
else if (res = 0) {
obj := {}
keys := ObjJS.GetKeys()
Loop % keys.length
k := keys[A_Index - 1], obj[k] := this._CreateObject(ObjJS[k])
}
Return obj
}
}
Значение userpic в первом блоке будет сохранено в переменную userpic1, во втором — userpic2 и т. д. Дальше сами думайте.
Почти то, что надо, спасибо! Оказалось, что всё уже настроено на работу в пределах блоков. Но остались вопросы: почему надо добавлять эти порядковые номера после переменных и почему автоматически не происходит перебор всех последующих блоков? Для этого можно вроде использовать loop, подставляя к переменной порядковый номер цикла, —
loop
MsgBox, % userpic%a_index% "`n" uname%a_index% "`n" commenter_journal_base%a_index% "`n" dtalkid%a_index% "`n" upictitle%a_index% "`n" article%a_index% "`n" ctime%a_index% "`n" userhead_url%a_index% "`n" dname%a_index% "`n"
но ведь неизвестно, сколько всего будет циклов. Иначе было бы проще: приходит список значений ключей с постоянными названиями переменных, который сразу можно куда-то подставить (в тэги и т.п.) и накапливать в какой-то переменной
mrg .= "<b>" userpic "</b>`n" ;...
Потом приходит следующий обновленный список ключей из следующего блока, с прежними названиями переменных, и т.д.
почему надо добавлять эти порядковые номера после переменных и почему автоматически не происходит перебор всех последующих блоков?
Перебор блоков и создание переменных происходят в этом цикле:
for k, v in obj.comments {
Loop, parse, keys, `n, `r
%A_LoopField%%k% := SearchKey(v, A_LoopField)
}
Количество блоков равно obj.comments.MaxIndex().
teadrinker, пользуюсь вашим json-парсером. Есть недостаток:
Строка(представляет из себя json-массив) конвертируется в объект без проблем, а вот обратно идет округление до N-нулей после запятой.
Как можно отключить округление?
Наглядный пример:
obj:=JSON.Parse("[2.460]")
MsgBox, % JSON.Stringify(obj[1])
Парсер тут ни при чём, просто при любых действиях с числами с запятой они в AHK по умолчанию округляются до шестого знака после запятой:
var := 0.1
MsgBox, % var + 0
Это можно изменить с помощью команды Format.
Если представить число, как строку, тогда увеличения количества цифр после запятой не произойдёт:
obj:=JSON.Parse("[""2.460""]")
MsgBox, % JSON.Stringify(obj[1])
class JSON
{
static JS := JSON._GetJScripObject()
Parse(JsonString) {
try oJSON := this.JS.("(" JsonString ")")
catch {
MsgBox, Wrong JsonString!
Return
}
Return this._CreateObject(oJSON)
}
Stringify(obj) {
if IsObject( obj ) {
isArray := true
for key in obj
if !( key = A_Index || isArray := false )
break
for k, v in obj
str .= ( A_Index = 1 ? "" : "," ) . ( isArray ? "" : this.Stringify(k) . ":" ) . this.Stringify(v)
return isArray ? "[" str "]" : "{" str "}"
}
else if (obj*1)
return obj
for k, v in [["\", "\\"], [A_Tab, "\t"], ["""", "\"""], ["/", "\/"], ["`n", "\n"], ["`r", "\r"], [Chr(12), "\f"], [Chr(08), "\b"]]
obj := StrReplace( obj, v[1], v[2] )
while RegexMatch( obj, "[^\x20-\x7e]", key ) {
str := Asc( key )
val := "\u" . Chr( ( ( str >> 12 ) & 15 ) + ( ( ( str >> 12 ) & 15 ) < 10 ? 48 : 55 ) )
. Chr( ( ( str >> 8 ) & 15 ) + ( ( ( str >> 8 ) & 15 ) < 10 ? 48 : 55 ) )
. Chr( ( ( str >> 4 ) & 15 ) + ( ( ( str >> 4 ) & 15 ) < 10 ? 48 : 55 ) )
. Chr( ( str & 15 ) + ( ( str & 15 ) < 10 ? 48 : 55 ) )
obj := StrReplace(obj, key, val)
}
Return """" obj """"
}
GetFromUrl(url, body := "", contentType := "", userAgent := "") {
; в случае удачи будет возвращена строка, в случае ошибки — массив с одним элементом-строкой с описанием ошибки
try {
XmlHttp := ComObjCreate("Microsoft.XmlHttp")
XmlHttp.Open("GET", url, false)
( contentType && XmlHttp.SetRequestHeader("Content-Type", contentType) )
( userAgent && XmlHttp.SetRequestHeader("User-Agent", userAgent) )
XmlHttp.Send(body)
}
catch e
Return ["Error!`n" . e.Message]
status := XmlHttp.Status
Return status = 200 ? XmlHttp.ResponseText : ["Error! Status: " . status . ", ResponseText: " . XmlHttp.ResponseText]
}
_GetJScripObject() {
VarSetCapacity(tmpFile, ((MAX_PATH := 260) - 14) << !!A_IsUnicode, 0)
DllCall("GetTempFileName", Str, A_Temp, Str, "AHK", UInt, 0, Str, tmpFile)
FileAppend,
(
<component>
<public><method name='eval'/></public>
<script language='JScript'></script>
</component>
), % tmpFile
JS := ObjBindMethod( ComObjGet("script:" . tmpFile), "eval" )
FileDelete, % tmpFile
JSON._AddMethods(JS)
Return JS
}
_AddMethods(ByRef JS) {
JScript =
(
Object.prototype.GetKeys = function () {
var keys = []
for (var k in this)
if (this.hasOwnProperty(k))
keys.push(k)
return keys
}
Object.prototype.IsArray = function () {
var toStandardString = {}.toString
return toStandardString.call(this) == '[object Array]'
}
)
JS.("delete ActiveXObject; delete GetObject;")
JS.(JScript)
}
_CreateObject(ObjJS) {
res := ObjJS.IsArray()
if (res = "")
Return ObjJS
else if (res = -1) {
obj := []
Loop % ObjJS.length
obj[A_Index] := this._CreateObject(ObjJS[A_Index - 1])
}
else if (res = 0) {
obj := {}
keys := ObjJS.GetKeys()
Loop % keys.length
k := keys[A_Index - 1], obj[k] := this._CreateObject(ObjJS[k])
}
Return obj
}
}
Регулярно выражаясь, как задать в исключаемом перечне (в этом: [^символы]) совпадение не по одному, а целиком по двум, трём символам (тег, например)?
Использовал ((?!НЕЭТО).)*, но выяснилось, что шаблон иногда отказывает. Имеется ли надежный аналог для AHK-скриптов?
Была инфа, что эффективней записывать этот шаблон следующим образом: (?:(?!НЕЭТО).)*, но так на AHK не работает.
Следующее выражение означает один любой символ из тех, которых нет в перечне: [^НЕЭТО]*. При использовании, перебор остановится на любой из перечисленных букв.
А нужен вариант выражения для исключения сразу по группе символов, а не по одному, как выше. То есть, вариант для выражений ((?!НЕЭТО).)* и (?:(?!НЕЭТО).)*, которые не подходят.
stealzy, а если конкретнее, с примерами?))
Так понял, нужно что-то вроде этого:
str := "1ab2cd3ef"
RegExMatch(str, "\d(?!ab|cd)", match)
MsgBox, % match
Пример получает из строки цифру, после которой нет ab или cd.
stealzy, про вперед смотрящие я знаю и иногда использую. Интересовало, как этот принцип применить к исключению по группе символов — как если бы это был один символ, в отличие от символа из перечня. Суть изложенного еще до награмождений была в указании разницы между известным шаблоном для поиска по одному символу ([^x]), и двумя вариантами шаблона с тем же принципом для поиска по группе символов (((?!НЕЭТО).)* || (?:(?!НЕЭТО).)*), с просьбой подсказать третий вариант. К примеру, ниже надо найти то, что для наглядности выделено капслоком:
str :=
(
</div></div></div></div></div></div><div></div><DIV ID="COMPOSER-123456789"><FORM><INPUT /><INPUT /><LABEL>_</LABEL><TABLE><TBODY><TR><TD><DIV><TABLE><TBODY><TR><TD><TEXTAREA ID="COMPOSERINPUT"></TEXTAREA></TD></TR></TBODY></TABLE></DIV></TD><TD><DIV><INPUT /></DIV></TD></TR></TBODY></TABLE></FORM><FORM><INPUT /><INPUT /><SPAN><INPUT /><SPAN></SPAN><INPUT /></SPAN></FORM></DIV></DIV></DIV></DIV><DIV><DIV><DIV><IMG /><DIV><DIV><A>_</A><A>_</A><A>_</A></DIV></DIV></DIV></DIV></DIV></DIV></DIV><DIV><DIV><A>_</A></DIV></DIV></div></div></body></html>
)
str := RegExReplace(str, "s)((<div[^>]*>)+)?<div[^>]* id=""composer[^""]*""><form((?!<abbr>).)*</a></div></div>", "")
MsgBox, % str
Почему-то на этом примере сама по себе неэффективная конструкция ((?!НЕЭТО).)*, не сработает (в отличие, скажем, от Notepad++). Как здесь применимы вперед смотрящие?
teadrinker, вроде, (?!<abbr>)* тоже не отработает при поиске ОТ и ДО, исключая указанный тег.
DD, конструкция (?!<abbr>)* не имеет смысла. Что она у вас означает?
ниже надо найти то, что для наглядности выделено капслоком
Не понятно, по какому принципу вы хотите искать этот текст. Чего именно после него не должно быть? Объясните на словах.
teadrinker, задача найти от <DIV ID="COMPOSER — до </A></DIV></DIV>, с условием, чтобы между ними не было тега <abbr>.
str =
(
</div><DIV ID="COMPOSER-123456789">этот текст<abbr>не должен быть найден</A></DIV></DIV></div></div><DIV ID="COMPOSER-123456789">этот текст нужно найти</A></DIV></DIV></a></div></div></div><abbr></a></div></div>
)
RegExMatch(str, "is)<DIV ID=""COMPOSER((?!<abbr>).)*?</a></div></div>", match)
MsgBox, % match
str =
(
</div></div></div></div></div></div><div></div><DIV ID="COMPOSER-123456789"><FORM><INPUT /><INPUT /><LABEL>_</LABEL><TABLE><TBODY><TR><TD><DIV><TABLE><TBODY><TR><TD><TEXTAREA ID="COMPOSERINPUT"></TEXTAREA></TD></TR></TBODY></TABLE></DIV></TD><TD><DIV><INPUT /></DIV></TD></TR></TBODY></TABLE></FORM><FORM><INPUT /><INPUT /><SPAN><INPUT /><SPAN></SPAN><INPUT /></SPAN></FORM></DIV></DIV></DIV></DIV><DIV><DIV><DIV><IMG /><DIV><DIV><A>_</A><A>_</A><A>_</A></DIV></DIV></DIV></DIV></DIV></DIV></DIV><DIV><DIV><A>_</A></DIV></DIV></div></div></body></html>
)
RegExMatch(str, "is)<DIV ID=""COMPOSER((?!<abbr>).)*?</a></div></div>", match)
MsgBox, % match
teadrinker, спасибо! Получается, дело было в неуказанной опции «is)», но с которой заработал в т.ч. валидный вариант поиска с исключением «(?:(?!<abbr>).)*».
Объяснения по сочетанию «is)» не нашёл — что оно означает? Разве отдельный модификатор «s)» не игнорирует регистр символов?
Странно, как вы это могли не заметить:
http://www.script-coding.com/AutoHotkey/RegExMatch.html
По переводным статьям всё же лучше не изучать, там далеко не всё.
Начать изучать имхо проще по переводной статье.
А после ее понимания уже почитать на английском.
Я делаю ровно наоборот. Читаю статьи по программированию всегда на английском, и только если что-то совсем непонятно, ищу аналоги на русском.
Malcev, о значении модификаторов по отдельности имел представление — непонятно, как они работают в объединенном виде.
А вот так с "вперед/назад смотрящими" получилось:
str =
(
</div></div></div></div></div></div><div></div><DIV ID="COMPOSER-123456789"><FORM><INPUT /><INPUT /><LABEL>_</LABEL><TABLE><TBODY><TR><TD><DIV><TABLE><TBODY><TR><TD><TEXTAREA ID="COMPOSERINPUT"></TEXTAREA></TD></TR></TBODY></TABLE></DIV></TD><TD><DIV><INPUT /></DIV></TD></TR></TBODY></TABLE></A></DIV></DIV>sss</FORM><FORM><INPUT /><INPUT /><SPAN><INPUT /><SPAN></SPAN><INPUT /></SPAN></FORM></DIV></DIV></DIV></DIV><DIV><DIV><DIV><IMG /><DIV><DIV><A>_</A><A>_</A><A>_</A></DIV></DIV></DIV></DIV></DIV></DIV></DIV><DIV><DIV><A>_</A></DIV></DIV></div></div></body></html>
)
RegExMatch(str, "is)<DIV ID=""composer[^>]*><form(?!abbr>)((.(?!abbr>)).*)(?=.*</a></div></div>)", match)
MsgBox, % match
непонятно, как они работают в объединенном виде.
Значит невнимательно читали:
Например, шаблон "im)abc" будет искать строку abc с опциями нечувствительности к регистру и многострочности (скобку можно опускать, если опций нет)
А что, при поиске точки — с опцией s) — учитывается регистр?
Опция "s" к регистру и поиску точки никакого отношения не имеет.
К примеру, я указал: искать от <DIV ID="COMPOSER — до </A></DIV></DIV>, с условием, чтобы между ними не было тега <abbr>. При этом, и <DIV ID="COMPOSER и </A></DIV></DIV>, находятся в нижнем регистре и в моём шаблоне и в тексте. Так почему должно иметь значение регистр того, что между ними (точки)?
Приведите короткий пример.
Точка может быть любым символом вне зависимости от регистра.
Выше они рассматривались. Вот так, в зависимости от разницы опций is/s — работает/не работает:
str =
(
</div></div></div></div></div></div><div></div><DIV ID="COMPOSER-123456789"><FORM><INPUT /><INPUT /><LABEL>_</LABEL><TABLE><TBODY><TR><TD><DIV><TABLE><TBODY><TR><TD><TEXTAREA ID="COMPOSERINPUT"></TEXTAREA></TD></TR></TBODY></TABLE></DIV></TD><TD><DIV><INPUT /></DIV></TD></TR></TBODY></TABLE></FORM><FORM><INPUT /><INPUT /><SPAN><INPUT /><SPAN></SPAN><INPUT /></SPAN></FORM></DIV></DIV></DIV></DIV><DIV><DIV><DIV><IMG /><DIV><DIV><A>_</A><A>_</A><A>_</A></DIV></DIV></DIV></DIV></DIV></DIV></DIV><DIV><DIV><A>_</A></DIV></DIV></div></div></body></html>
)
RegExMatch(str, "is)<DIV ID=""COMPOSER(?:(?!<abbr>).)*</a></div></div>", match)
MsgBox, % match
У вас же всё капслоком прописано.
RegExMatch(str, "<DIV ID=""COMPOSER(?:(?!<abbr>).)*</A></DIV></DIV>", match)
Дело в том, что на реальном примере из файла, в котором, как и в шаблоне, всё было в нижнем регистре — не работало. Но теперь понял, что помимо is — нужна ещё точка перед последней звездочкой: «(?:(?!НЕЭТО).).*».
Как одним выражением находить слово, и слово с тэгами? —
«слово»
«сл<em>о</em>во»
Как находить только кириллицу, в которой также может присутствовать единица или англ. буква I? Пробовал в т.ч. так: «[А-Яа-яЁёI1]+», но всё не то.
А, так вроде надо было:
\b([А-Яа-яЁёI1][А-Яа-яЁёI1]*)\b
Как настроить выражение, чтобы не захватывалось содержимое внутри тегов? —
Str =
(
^journalist COLUMNS Released accuses own lawyers of political show
COLUMNS Political stalem ate123456789 injjkk Europe
Frankly, had Masoud Barzani foreseen the course of developments in the recent period, he definitely would have given up the idea of holding an independence referendum. With the public's pressure and expectations regarding the referendum, Barzani went to the polls to prove his leadership. • Yet, what happened over the past 10 days jeopardized his position in the Kurdistan region, let alone consolidating his leadership <p> <a href="http://www.bibliotecapleyades.net/sociopolitica/esp_sociopol_denver02.htm" rel="nofollow"></a><a href="http://www.bibliotecapleyades.net/sociopolitica/e" rel="nofollow">http://www.bibliotecapleyades.net/sociopolitica/e</a>… </p> But how did the developments end up here? How did Barzani make such wrong calculations what did he depend on? And most importantly, what is awaiting the Iraqi Kurdistan Regional Government (KRG) from now on?
While aspiring to make Kirkuk the capital city of Kurdistan$ It plays out almost as a parody. Bill Nye has certainly become very judgmental, intolerable and rude in his own right.
)
StartPos := 1
While StartPos := RegExMatch(Str, "(.{1,500}.+?([,;:—\?\!\n\.]+\s*|$))", Found, StartPos) + StrLen(Found)
MsgBox, %Found1%
А что должно захватываться?
Захватываться должно вне тегов — до перечисленных символов, когда они есть. Если не захватится — тоже результат).
Я не очень понял вашу регулярку. Можно просто теги удалить — останется то, что вне их.
Там сначала захватывается от 1 до 500 символов, и уже после этого ищется ближайший перечисленный стоп-символ (что позволяет не выходить за заданный лимит символов). Здесь был разговор — viewtopic.php?pid=125492#p125492. К примеру, ниже после первого слова "journalist" и до самого конца, текст представляет собой условный тег. И задача в том, чтобы поиск останавливался на слове журналист, не заходя в пределы ломаных скобок —
Str =
(
^journalist <COLUMNS Released accuses own lawyers of political show
COLUMNS Political stalem ate123456789 injjkk Europe
Frankly, had Masoud Barzani foreseen the course of developments in the recent period, he definitely would have given up the idea of holding an independence referendum. With the public's pressure and expectations regarding the referendum, Barzani went to the polls to prove his leadership. • Yet, what happened over the past 10 days jeopardized his position in the Kurdistan region, let alone consolidating his leadership But how did the developments end up here? How did Barzani make such wrong calculations what did he depend on? And most importantly, what is awaiting the Iraqi Kurdistan Regional Government (KRG) from now on?
While aspiring to make Kirkuk the capital city of Kurdistan$ It plays out almost as a parody. Bill Nye has certainly become very judgmental, intolerable and rude in his own right.>
)
StartPos := 1
While StartPos := RegExMatch(Str, "(.{1,500}.+?([,;:—\?\!\n\.]+\s*|$))", Found, StartPos) + StrLen(Found)
MsgBox, %Found1%
чтобы поиск останавливался на слове журналист
Именно останавливался, или чтоб продолжался после тега?
Останавливался.
Замените первую и вторую точки на [^<]
Если я правильно заменил, так захватывается текст из тега, — а нужен тот, что перед тегом, чтобы текст не делился внутри тега, но перед ним.
Да, дезинформировал. Если нужно, чтобы поиск останавливался на первом теге, можно просто предварительно удалить всё, начиная с первого тега.
Но удаленное потом будет нужно, чтобы продолжить после тега.
Так вы же сказали, что нужно, чтобы останавливался? Если нет, тогда предварительно удалите все теги:
MsgBox, % Str := RegExReplace(Str, "<[^>]+>")
А в выражении это нельзя предусмотреть, так как если удалить теги, это уже не будет HTML).
Так вы же их не насовсем удаляете, только для поиска. Сохранять с удалёнными тегами не нужно.
Как для части выражения — <p><strong>.{1,150}[^\.]</strong></p> — правильно задать обработку только в случае, если содержимое тегов короче 150 символов и не заканчивается точкой?
post_only=
(
<p><strong>The YouTube channel of an artist named That Poppy has been mystifying viewers for years. Behind the weirdness of her videos is a disturbing story: The mind control of a young pop star.</strong></p>
<p><strong>The YouTube channel of an artist named.</strong></p>
<p><strong>The YouTube channel of an artist named</strong></p>
<p><strong>The YouTube channel of an artist named
</strong></p>
)
match := ""
while RegExMatch(post_only, "iO)(<h1|<h2|<h3|<h4|<h5|<p><strong>.{1,150}[^\.]</strong></p>)", match, match ? match.Pos + match.Len + 18 : 1)
post_only := RegExReplace(post_only, match[0], "<a name=""vc_" . A_Index . """></a>" . match[0],, 1, match.Pos)
MsgBox % post_only
Не отказывайте себе в удовольствии, обрабатывая строки только регулярными выражениями. Есть и другие способы получать из строки информацию:
post_only =
(
<p><strong>The YouTube channel of an artist named That Poppy has been mystifying viewers for years. Behind the weirdness of her videos is a disturbing story: The mind control of a young pop star.</strong></p>
<p><strong>The YouTube channel of an artist named.</strong></p>
<p><strong>The YouTube channel of an artist named</strong></p>
<p><strong>The YouTube channel of an artist named
</strong></p>
)
For i, item in DoMatch(post_only, "<p><strong>") {
RegExMatch(item, "<p><strong>(.*)</strong></p>", m)
if (( len := StrLen(m1)) < 150 && (lastChar := SubStr(m1, len)) != ".")
MsgBox % Format("Удачно срослось!`nВсего '{}' символов и последний '{}'`n`n'{}'", len, lastChar, m1)
else
MsgBox % Format("Не срослось. :(`nВсего '{}' символов и последний '{}'`n`n'{}'", len, lastChar, m1)
}
ExitApp
DoMatch(str, reg_ex) {
arr := [], p1 := p2 := 1, match := ""
While (p2 := RegExMatch(str, reg_ex, match, p2 + StrLen(match))) {
(A_Index > 1 && arr.Push( SubStr(str, p1, p2 - p1) ))
p1 := p2
} arr.Push( SubStr(str, p1, StrLen(str) - p1) )
Return arr
}
lastChar не будет получен, если первое условие в if возвращает false.
(<h1|<h2|<h3|<h4|<h5|<p><strong>.{1,150}[^\.]</strong></p>)
Я не понял, что это должно означать. Между чем и чем тут выбор? Зачем весь паттерн взят в скобки?
KusochekDobra
К сожалению, удовольствие расписывать такие функции мне не вполне доступно, отчего и пытался удовольствоваться уточнением регулярки)).
teadrinker
Это отсюда. Ищется начало тегов HEADER, либо целый тег параграфа по условию, с добавкой флагов перед ними. А скобки на всякий случай — потому что используется знак перечисления вариантов «|». В любом случае, все выражение окажется в переменной match.
Всё выражение в любом случае окажется в переменной, а скобки нужны для создания подшаблона, подшаблон — это часть всего шаблона, поэтому заключать в них весь шаблон никакого смысла нет.
используется знак перечисления вариантов «|»
Ну и какие варианты там перечисляются?
Перечисляются варианты тегов HEADER (<h1, <h2 ...) и содержимое тега параграфа (<p>...</p>).
В смысле, устроит любой текст, начинающийся с <h1 и до самого конца?
Для тегов HEADER достаточно расставлять флаги, исходя из начальных названий тегов, но содержимое <p><strong>...</strong></p> уточняется полностью, чтобы выяснить длину их содержимого и наличие точки на конце.
Для тегов HEADER достаточно расставлять флаги
Мне эта фраза ни о чём не говорит. Давайте лучше на каком-то более простом примере, типа "abcdefgh".
Так ведь на изначальном примере понятно, что нужно расставить <a name="vc_\d+"></a> перед фрагментами начальных тегов <h1, <h2, <h3, <h4, <h5. А в случае с <p><strong> — только когда их содержимое короче 150 символов и не содержит точки на конце.
<a name="vc_\d+"></a> в том коде уже расставляются — нужно лишь уточнить фрагмент шаблона с «<p><strong>.{1,150}[^\.]</strong></p>».
Вы лучше сразу словами поясняйте, чего ждёте от шаблона. Наверно ваш вариант такой:
RegExMatch(post_only, "iO)<h1|<h2|<h3|<h4|<h5|<p><strong>[^<]{1,148}[^\.]</strong></p>", match, match ? match.Pos + match.Len + 18 : 1)
Это если я правильно понял фразу «только когда их содержимое короче 150 символов», то-есть максимум 149.
С доп. тегами внутри, не срабатывает:
post_only=
(
<p><strong>The YouTube <b>channel</b> of an artist named That Poppy has been mystifying viewers for years. Behind the weirdness of her videos is a disturbing story: The mind control of a young pop star.</strong></p>
<p><strong>The YouTube <b>channel</b> of an artist named.</strong></p>
<p><strong>The YouTube <b>channel</b> of an artist named</strong></p>
<p><strong>The YouTube <b>channel</b> of an artist named</strong></p>
)
match := ""
while RegExMatch(post_only, "iO)<h1|<h2|<h3|<h4|<h5|<p><strong>[^<]{1,148}[^\.]</strong></p>", match, match ? match.Pos + match.Len + 18 : 1)
post_only := RegExReplace(post_only, match[0], "<a name=""vc_" . A_Index . """></a>" . match[0],, 1, match.Pos)
MsgBox % post_only
Вот так почему-то обрабатываются те, что с точкой на конце, хотя знаки «?!» должны вроде отрицать последующее —
iO)<p><strong>.{1,150}(?!\.</strong></p>)
Еще тема возникла по предыдущему вопросу. Можно ли задать приоритет для перечисленных стоп-символов, а также добавить туда закрывающий тег, как один из таких символов? —
Str =
(
<p>That being said, is That Poppy actually under mind control or is it all a big act? Is Titanic Sinclair an actual MK <a "https//vigilantcitizen.com/musicbusiness/poppy-youtube-star-illuminati-mind-control"> handler </a> or is he simply tapping into “conspiracy” fodder? Are we witnessing actual mind control or a clever marketing <i>strategy</i>? Difficult to say. One thing is for sure, That Poppy is actually tied to a high-level record <a "https://vigilantcitizen.com/musicbusiness"> label </a> where people do not play around. Also, and more importantly, That Poppy is another proof that this is basically the one kind of messages and symbolism that is <b>allowed to be associated</b> with her, and most of pop culture. They want this Illuminati mind control symbolism to be what is <a "https//vigilantcitizen.com"> cool, viral, trendy, edgy </a>, experimental and so forth. While some might see That Poppy as an innovative thing, she is actually repeating the same story that <a 001> was being told </a> by nearly 10 years ago – and by countless others afterward. The only thing that changed is the overall tone and delivery format which <a "https//vigilantcitizen.com/musicbusiness/poppy-youtube-star-illuminati-mind-control"> was adapted </a> to the viewing habits of today’s youth who love short, viral, absurd videos. However, in the end, the message is the same: The Illuminati is celebrated as the “highlight of these artists’ lowlifes” … until the elite is done with them.</p>
)
StartPos := 1
While StartPos := RegExMatch(Str, "s)(.{1,700}.+?([,:;—\?\!\n\.]+\s*|$))", Found, StartPos) + StrLen(Found)
MsgBox, % Found1
Del
Каким будет выражение, которое захватит начальные подряд идущие теги, с возможными пробелами и табуляцией между/перед ними, напр.:
<p> <a href="4rthmurla.jpg"><blockquote>
или
<p><a href="4rthmurla.jpg"><blockquote>
match1 =
(
<p> <a href="4rthmurla.jpg"><blockquote> j <img src="4rthmurla.jpg"></a></blockquote></p>
)
match1 := RegExReplace(match1, "m`a)^((<[^>]*>(\s|\t)?)+)+", "$1")
msgbox % match1
"Начальные, подряд-идущие" — первые три?
match1 =
(
<p> <a href="4rthmurla.jpg"><blockquote> j <img src="4rthmurla.jpg"></a></blockquote></p>
)
result := RegExMatch(match1, "<\w+>([<\s\w=""\.]+>){0,2}", m)
msgbox % "'" m "'"
KusochekDobra, имелись в виду не только первые три, а любое их количество, которое может стоять в начале разбираемой строки и перемежаться пробелами-табуляцией.
<p><p> <a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><blockquote> j <img src="4rthmurla.jpg"></a></blockquote></p>
Захватывает до момента, пока не встретит символ закрывающегося тега "/":
str =
(
<p><p> <a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><blockquote> j <img src="4rthmurla.jpg"></a></blockquote></p>
)
RegExMatch(str, "([<\s\w=""\.>]+)+(?!\/)", m)
msgbox % "'" m "'"
KusochekDobra, так понимаю, что
начальные подряд идущие теги
это теги и их содержимое до текста, который расположен вне тега — "j".
Вероятно и так. Благодарю. Было бы неплохо сразу про такие "маркеры" пояснять. Мне подумалось, что под "начальные", подразумевается "открывающие".
str =
(
<p><p> <a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><blockquote> j <img src="4rthmurla.jpg"></a></blockquote></p>
)
RegExMatch(str, "(<[\s\w=""\.]+>([\s]+)?)+(?!\w+)", m)
msgbox % "'" m "'"
Почему-то, стоит вклинить где-нибудь вначале <b>bold</b> — и захват до открывающего <b> не происходит —
str =
(
<p><p> <a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpgdd"><b>bold</b><a href="4rthmurla.jpg"> <blockquote></blockquote>(((((((((((((((((((((( j <img src="4rthmurla.jpg"></a></blockquote></p>
)
RegExMatch(str, "(<[^>]*>([\s]+)?)+(?!\w+)", m)
msgbox % m
Может есть более простой способ надежно захватить сплошные теги (с возможными пробелами-табуляцией между ними) до первого текста?
Прошу прощения. Так, вроде похоже:
str =
(
<p><p> <a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpgdd"><b>bold</b><a href="4rthmurla.jpg"> <blockquote></blockquote>(((((((((((((((((((((( j <img src="4rthmurla.jpg"></a></blockquote></p>
)
RegExMatch(str, "(<[\s\w=""\.]+>([\s]+)?)+(?<!\w)", m)
msgbox % m
Я бы не стал определять содержание тега, как [\s\w=""\.]+:
str =
(
<p><p> <a href="http://mysite.com/4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpgdd"><b>bold</b><a href="4rthmurla.jpg"> <blockquote></blockquote>(((((((((((((((((((((( j <img src="4rthmurla.jpg"></a></blockquote></p>
)
RegExMatch(str, "(<[\s\w=""\.]+>([\s]+)?)+(?<!\w)", m)
msgbox % m
Как вариант:
str =
(
<p><p> <a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpg"><a href="4rthmurla.jpgdd"><b>bold</b><a href="4rthmurla.jpg"> <blockquote></blockquote>(((((((((((((((((((((( j <img src="4rthmurla.jpg"></a></blockquote></p>
)
MsgBox, % "|" . RegExReplace(str, "(?<=>)\s*[^\s<].*") . "|"
Интересно, почему начальные теги не находятся в первой группе ($1), несмотря на то, что заключены в общие скобки? —
str =
(
<p><p> <a><a><a><a></b><b>bold</b>bold</b><a> <blockquote></blockquote> (((((((((((((((((((((( j <img src="4rthmurla.jpg"></a></blockquote></p>
)
str := RegExReplace(str, "m`a)^((<[^>]*>([\s]+)?)+(?<!\w))(.*)$", "$1$2$3-----------------$4")
msgbox % str
Как в следующем формате получать определенные группы до начальных тегов — и всего остального в строке? —
str =
(
<p><p> <a><a><a><a></b><b>bold</b>bold</b><a> <blockquote></blockquote> (((((((((((((((((((((( j <img src="4rthmurla.jpg"></a></blockquote></p>
)
str := RegExReplace(str, "m`a)((?<=>)\s*[^\s<].*)(.*)$", "$1-----------------$2-----------------$3-----------------$4-----------------$5")
msgbox % str
Требуется заключить в группу начальные сплошные теги строки, потом во вторую группу — текст (с возможными тегами в середине), а в третью — конечные сплошные теги.
DD, поясните, зачем у вас всё время используются опции m`a ?