0

我正在尝试在网页的 H1 标记中查找所有文本。我正在使用代码:

myTextLoader.addEventListener(Event.COMPLETE, onLoaded);
function onLoaded(e:Event):void {
    webText = e.target.data;
    headingText = webText.match( /<H1>([^]*?)<\/H1>/ ); 
}

myTextLoader.load(new URLRequest("http://www.MyWebPage.com"));

完成后,我的数组中有四个条目:前两个是我所期望的,但接下来的两个是 headingText[2] = 401
headingText[3] = [网页的全部内容。]

我究竟做错了什么?

此外,我在结果中得到了 H1 标签。有没有办法告诉表达式给我 H1 标签内的所有内容,没有 H1 标签?

谢谢你,

4

1 回答 1

1

正如 match 方法的文档所示:

如果 pattern 是正则表达式,为了返回一个包含多个匹配子字符串的数组,必须在正则表达式中设置 g(全局)标志:

  • 如果未设置 g(全局)标志,则返回数组将包含不超过一个匹配项,并且正则表达式的 lastIndex 属性保持不变。
  • 如果设置了 g(全局)标志,则该方法在字符串的开头(索引位置 0)开始搜索。如果匹配的子字符串是空字符串(可能出现在 /x*/ 等正则表达式中),则该方法将该空字符串添加到匹配数组中,然后在下一个索引位置继续搜索。方法完成后,正则表达式的 lastIndex 属性设置为 0。

当模式参数是设置了 g(全局)标志的正则表达式时,如果未找到匹配项,则该方法返回一个空数组。如果模式参数是字符串或非全局正则表达式且未找到匹配项,则该方法返回 null。如果您没有传递任何值(或未定义的值)作为模式参数,则该方法返回 null。

问题是你没有指定全局标志并且你最多得到一个结果,修复它只需添加g到你的正则表达式模式。但是您可以;不确定加载的页面是否会使用 H1 或 h1,那么您还应该添加i- 忽略大小写的标志,您需要的最后一个标志是 dotall 以匹配换行符。您修改后的正则表达式应如下所示:

webText.match( /\<H1>(.*?)\<\/H1>/gis );

@Jason Reeves 提出了很好的解决方案,但并非所有 HTML 页面都是正确的 XML 文件(有效),这意味着var webText:XML = new XML(event.target.data);“XML”中的任何错误都会引发错误,从而使该解决方案无法用于您无法控制的来源。

于 2012-11-30T08:00:14.733 回答