【问题标题】:Find all HTML sibling element in iOS在 iOS 中查找所有 HTML 兄弟元素
【发布时间】:2015-08-27 13:41:47
【问题描述】:

我有一个巨大的 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(回车)、\ " (双引号) 和 \' (单引号)

doc

【问题讨论】:

  • 在这种情况下,正斜杠既不是特殊字符也不是分隔符。没有必要逃避它。您可能需要检查 nsregex 是否需要引用分隔符 。否则,正则表达式可能会因为空格而找不到任何东西。你可以试试:"&lt;article\\s+class\\s*=\\s*\"box-product-big[ ]+box-product-full[ ]+clearfix\"\\s*&gt;[\\S\\s]*?&lt;/article\\s*&gt;"

标签: html ios regex nsregularexpression


【解决方案1】:

您正在使用前向 / 这是一个特殊字符,因此您必须使用 \/ 使用反斜杠对其进行转义:

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

引用documentation

正则表达式元字符

必须引用才能被视为文字的字符是 * ? + [ ( ) { } ^ $ | \ . /

顺便说一句,你可以像这样缩短你的正则表达式:

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

【讨论】:

  • @János 尝试使用两个反斜杠 \\/ 并告诉我
  • 我尝试了你所有的建议,你提到的转义不是根据文档,但缩短和省略 class= .. 部分有帮助,即使没有括号
  • @János 太好了,很高兴至少能帮上一点忙 :)
猜你喜欢
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 2014-07-16
  • 2020-11-15
  • 2014-05-15
  • 1970-01-01
相关资源
最近更新 更多