2015-06-11 3 views
4

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

<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:

enter image description here

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

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


Я попытался с различным побегом, но получают сообщение об ошибке:

enter image description here

String literals can include the following special characters: The escaped special characters \0 (null character), \ (backslash), \t (horizontal tab), \n (line feed), \r (carriage return), \" (double quote) and \' (single quote)

doc

+0

Прямой слэш не является специальным символом, ни разделителем в этом случае. Не нужно избегать этого. Вы можете проверить, требуется ли nsregex для разделителя _and_. В противном случае регулярное выражение просто не может найти ничего из-за пробелов. Что-то, что вы можете попробовать: ''

[ \\ S \\ s] *? "' – sln

+0

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/ 1732454 # 1732454 – Persijn

ответ

3

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

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

Цитируя documentation:

Regular Expression Metacharacters

Characters that must be quoted to be treated as literals are * ? + [ () { }^$ | \ . /

enter image description here

Btw, вы можете сократить ваши regex вот так:

<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>) 
+0

@ János попробует использовать две обратные косые черты '\\ /' и дайте мне знать –

+0

Я пробовал все ваши предложения, избегая упоминания вас не по документам, но сокращение и уход из 'class = ..' части помогли , даже без круглых скобок –

+0

@ János отлично, рад помочь хотя бы немного :) –