【问题标题】:ActionScript HTML Regexp SelectorActionScript HTML 正则表达式选择器
【发布时间】:2011-04-26 01:46:27
【问题描述】:

在使用正则表达式时我真的很糟糕,所以请多多包涵。

我有一段 ActionScript 代码,它应该评估一串 HTML 并将其分解为单独的部分。所以像<p>Hi</p><span>Hi</span><a href="index.php">Hi</a> 这样的字符串会被翻译成:

1. <p>Hi</p>
2. <span>Hi</span>
3. <a href="index.php">Hi</a>
...

但是,当我运行此代码的测试版本时,我得到一个 null 值作为回报。我很确定我的正则表达式字符串很好,但是我在 ActionScript 中做错了。你能指出正确的方向吗?我的代码如下:

var evaluatedInput:RegExp = new RegExp('/<([A-Z][A-Z0-9]*)\b[^>]*>(.*?)</\1>/');
var output:Object = evaluatedInput.exec("<p>Hi</p><span>Hi</span><a href=\"index.php\">Hi</a>");
trace(output);

感谢您的宝贵时间,
spryno724

【问题讨论】:

    标签: regex actionscript-3 html-parsing exec selector


    【解决方案1】:

    在 ActionScript 中,您应该使用以下两种方法之一来创建 RegExp 对象。您可以将表达式括在 /.../ 分隔符中以形成正则表达式文字:

    /<([A-Z][A-Z0-9]*)\b[^>]*>(.*?)<\/\1>/gi
    

    ...或者您可以将其写为 string 文字,然后将其传递给 RegExp 构造函数:

    new RegExp('<([A-Z][A-Z0-9]*)\\b[^>]*>(.*?)</\\1>', 'gi')
    

    您似乎在使用这两种方法的混合体,结果得到了垃圾。其他一些兴趣点:

    • 由于正则表达式文字使用正斜杠作为分隔符,因此正则表达式本身中的任何 / 都需要使用反斜杠进行转义,例如 &lt;\/\1&gt;

    • 在字符串版本中,它是您必须转义的 反斜杠(例如,&lt;/\\1&gt;)。否则,AS 编译器会尝试将其视为字符串文字转义序列的一部分,例如 \"\n。在您的代码中,\b 表示退格,而不是单词边界,\1 可能被视为语法错误,而不是您想要的反向引用。

    • 您的正则表达式需要g ("global") 和i ("ignore-case") 修饰符;我已经演示了如何应用它们。

    【讨论】:

    • 哇,谢谢艾伦。我越来越近了,但是,由于我对正则表达式的理解很差,我并不相当在那里。使用您的正则表达式选择器,我得到以下输出&lt;p&gt;Hi&lt;/p&gt;,p,Hi。有可能只得到&lt;p&gt;Hi!&lt;/p&gt;,&lt;span&gt;Hi&lt;/span&gt;,&lt;a href="index.php"&gt;Hi&lt;/a&gt; 而不仅仅是标签或标签内容?
    • 没关系,我明白了!感谢您修复正则表达式并提供良好的解释!
    【解决方案2】:

    使用示例

    改编自这里
    http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/RegExp.html#exec()

         var myPattern:RegExp = /\>\</g;  
         var str:String = "<p>Hi</p><span>Hi</span><a href=\"index.php\">Hi</a>";
         var result:Object = myPattern.exec(str);
    
         //To loop through all results manually
         while (result != null) {             
             trace ( result.index, "\t", result);            
             result = myPattern.exec(str);
         }
    
         //or, just replace. Note this does not required the myPattern.exec(str);
         str.replace(myPattern, ">\n<");
    

    原答案

    看到这个答案:

    AS3 RegEx returns null

    至少,gSkinner 的工具应该可以解决您的问题。

    具体来说,要执行您想要执行的操作,您可以使用以下正则表达式:

    /\>\</g
    

    在你的匹配项上,使用索引值,并替换为:

    >\n<
    

    您可以使用替换选项卡在 gskinner Regexr 工具上自行测试。

    【讨论】:

    • 感谢您的帮助,但是我现在的正则表达式技能太差了,以至于我很难跟上您。您能否发布我在上面发布的 ActionScript 正则表达式选择器的更正版本?
    • 嗯...感谢您的更新,但我尝试了您的示例,但没有返回任何内容。 :(
    • 很抱歉没有完成。完全更新,应该可以正常工作。我已经测试过了,按预期工作。
    • &lt;&gt; 在 AS3 正则表达式(或大多数其他风格中)没有特殊含义。但在某些情况下,\&lt;\&gt; 确实 具有特殊含义(即单词边界),因此最好不要逃避它们。
    • 谢谢艾伦,你是对的......虽然逃脱他们也没有伤害。 :)
    猜你喜欢
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 2019-05-18
    • 1970-01-01
    • 2015-01-11
    相关资源
    最近更新 更多