【问题标题】:how to get the html text length without set it to a textfield?如何在不将其设置为文本字段的情况下获取 html 文本长度?
【发布时间】:2013-08-26 11:08:25
【问题描述】:

在 actionscript 中,我没有找到一种直接的方法来获取 html 文本的实际字符串长度。这就是我让事情工作的方式

var myText:String = "<p>This is <b>some</b> content to <i>render</i> as <u>HTML</u> text.</p>"; 
myTextBox.htmlText = myText;
trace(myTextBox.length);

处理大量的 html 文本会是一个性能问题。

有没有一种方法可以让我不必将长度传递给文本设备?

【问题讨论】:

    标签: html actionscript-3 flash


    【解决方案1】:

    我看到了两种从 xml 中提取文本的方法:

    1. 对于xHTML,最好的方法是将其解析为 XML 并提取所有文本节点
    2. 对于所有类型的文本,您可以尝试 RegExp 匹配不属于 HTML 标记的文本 (http://regexr.com?363li)

      var s:String = "<p>This is <b>some</b> content to <i>render</i> as <u>HTML</u> text.</p>";
      
      //by TextField
      var tf:TextField = new TextField();
      tf.htmlText = s;
      trace(tf.text);
      trace(tf.length);
      
      //well-formed XML
      XML.ignoreWhitespace = false;
      var x:XML = new XML(s);
      
      var t:String = "";
      var list:XMLList = x..*;
      for each(var node:XML in list)
          if(node.nodeKind() == "text")
              t += node;
      
      trace(t);
      trace(t.length);
      
      //by RegExp (non wel formed XML)
      var match:Array = s.match(/(?<=^|>)[^><]+?(?=<|$)/gs);
      s = match.join("");
      trace(t);
      trace(t.length);
      

    输出:

    22528
    21  ms
    22528
    35  ms
    22528
    20  ms
    

    但所有这些技术在性能上似乎几乎相等,正如您所见,对于具有 22k 个字符的字符串,所有方法在 20-30 毫秒内以几乎相同的结果运行,但无论如何您都可以尝试两种方法作为输入。

    【讨论】:

    • 所以你必须使用正则表达式。我用匹配任何标签中所有文本的正则表达式更新了我的答案。
    • 22k 太少了,试试 1 MB,你会看到区别
    • 是的,似乎在某些大小的 TextField 出现滞后后,我尝试了 720k 字符并得到以下结果:6825 ms (TextField)、269 ms (XML)、597 ms (RegExp)
    猜你喜欢
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 2012-11-11
    • 2022-06-10
    相关资源
    最近更新 更多