为什么NSRegularExpression没有返回匹配索引?

时间:2018-01-03 00:53:55

标签: jquery regex swift cocoa nsregularexpression

假设我想迭代以下HTML进行正则表达式匹配:

<ul class="product_images">
    <li>
        <a data-style-name="keyword_1">
            <img>
        </a>
    </li>
    <li>
        <a data-style-name="keyword_2">
            <img>
    </a>
    </li>
</ul>

我可以使用像Kanna这样的解析器和像NSRegularExpression这样的块迭代器方法来计算<li>的每个实例并返回第一个匹配的索引,然后我可以使用它模拟鼠标点击匹配元素,如下所示:

WKWebView.evaluateJavaScript("document.getElementsByClassName('product_images')[\(keywordIndex)].click()", completionHandler: nil)

但是如何使用像$("li:contains('keyword_2')")这样的jQuery选择器呢?来自Python和JavaScript,我无法适应Swift的语法,我觉得我能用jQuery选择器压缩我的函数。大多数threads建议使用依赖项,但我想知道是否有办法在Swift中本地执行此操作 - 也许NSSelectorFromString?也就是说,如果任何更熟悉这种语言的人都能指出我正确的方向,我会非常感谢他的帮助。我的代码示例如下。实际上,我无法计算每个<li>元素;我想点击包含keyword_2的内容。

// Go to parent of match element and count each <li> element

func findKeyword() {
    var keyword = "keyword_2"
    var keywordIndex = 0
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.75) { 
            self.browserView.evaluateJavaScript("document.getElementsByTagName('html')[0].innerHTML.toString()", completionHandler: { (html: Any?, error: Error?) in
                if let HTML = html as? String {
                    let doc = try? Kanna.HTML(html: HTML, encoding: String.Encoding.utf8)
                    for string in (doc?.css("ul[class^='product_images']/li"))! {
                        if keyword(true, {$0 && string.text!.range(of: $1) != nil}) {
                            print("Found: " + string.text!)
                        }
                        keywordIndex += 1
                    }
                }
            })
    }
}

1 个答案:

答案 0 :(得分:1)

解决了问题!问题出在我的for循环中 - 特别是第一行:

  36:18  warning  Unexpected unnamed function          func-names
  38:12  warning  Unexpected unnamed method 'success'  func-names
  47:10  warning  Unexpected unnamed method 'error'    func-names
  56:8   warning  Unexpected unnamed method 'end'      func-names

我应该使用for string in (doc?.css("ul[class^='product_images']/li"))! { ... 时使用string,因为这是我正在寻找的字符串。因此,我在上面的序列中替换了keyword string,一切顺利。