Найти все родственные элементы HTML в iOS

У меня огромный HTML, но на определенном уровне есть 10 штук article элемента. Мне нужна тема.

<article class="box-product-big box-product-full clearfix" >
    <div class="list-left">

        <div class="cover">
            <a id="book_cover_3100529" href="/film/fritz_lang.m-egy-varos-keresi-a-gyilkost-dvd.html">
                                                            <img src="http://s06.static.libri.hu/cover/d4/3/1090228_3.jpg" alt="Fritz Lang - M- Egy város keresi a gyilkost - DVD"/>
                                                </a>
                                </div>
        <div class="desc">
            <a class="book-title" href="/film/fritz_lang.m-egy-varos-keresi-a-gyilkost-dvd.html">

..

</article>

Вот соответствующий DOM:

введите здесь описание изображения

С помощью следующего шаблона я пытаюсь получить их, но возвращается нулевая часть:

var error: NSError?
let pattern = "<article class=\"box-product-big box-product-full clearfix\">[\\S\\s]*?</article>"
var regex = NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions.CaseInsensitive, error: &error)!
if error != nil {
    println(error)
}
let a = regex.matchesInString(str, options: NSMatchingOptions.ReportCompletion, range: NSMakeRange(0, count(str)))

Есть идеи, что не так?

Данные взяты отсюда: http://www.libri.hu/talalati_lista/?text=m


Пробовал с разным экранированием, но получаю ошибку:

введите здесь описание изображения

Строковые литералы могут включать следующие специальные символы: Экранированные специальные символы \0 (нулевой символ), \ (обратная косая черта), \t (горизонтальная табуляция), \n (перевод строки), \r (возврат каретки), \" (двойной кавычка) и \' (одинарная кавычка)

документ


person János    schedule 11.06.2015    source источник
comment
Косая черта в данном случае не является ни специальным символом, ни разделителем. Нет необходимости избегать этого. Вы можете проверить, должен ли nsregex иметь разделитель and в кавычках. В противном случае регулярное выражение просто ничего не найдет из-за пробелов. Что-то, что вы можете попробовать: "<article\\s+class\\s*=\\s*\"box-product-big[ ]+box-product-full[ ]+clearfix\"\\s*>[\\S\\s]*?</article\\s*>"   -  person    schedule 15.06.2015
comment
stackoverflow.com/questions/1732348/   -  person Persijn    schedule 20.06.2015


Ответы (1)


Вы используете прямой /, который является специальным символом, поэтому вам нужно экранировать его обратной косой чертой, используя \/:

let pattern = "<article class=\"box-product-big box-product-full clearfix\">[\\S\\s]*?<\/article>"
                                                  Escape slash with backslash ---------^

Цитирование документации:

Метасимволы регулярных выражений

Символы, которые должны быть заключены в кавычки, чтобы рассматриваться как литералы: * ? + [ ( ) { } ^ $ | \ . /

введите здесь описание изображения

Кстати, вы можете сократить свое регулярное выражение следующим образом:

<article[\S\s]*?<\/article>

Код

var error: NSError?
let pattern = "<article[\\S\\s]*?<\/article>"
var regex = NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions.CaseInsensitive, error: &error)!
if error != nil {
    println(error)
}
let a = regex.matchesInString(str, options: NSMatchingOptions.ReportCompletion, range: NSMakeRange(0, count(str)))

Кроме того, вы можете использовать группы захвата для захвата контента:

(<article[\S\s]*?<\/article>)
person Federico Piazza    schedule 14.06.2015
comment
@János попробуйте использовать две обратные косые черты \\/ и дайте мне знать - person Federico Piazza; 14.06.2015
comment
Я перепробовал все ваши предложения, упомянутое вами экранирование не соответствует документам, но помогло сокращение и исключение class= .. части, даже без круглых скобок. - person János; 14.06.2015
comment
@János отлично, рад хоть немного помочь :) - person Federico Piazza; 14.06.2015