【问题标题】:Regex match spaces in html attributehtml属性中的正则表达式匹配空格
【发布时间】:2009-05-14 09:14:23
【问题描述】:

我有一堆像这样行的html:

<a href="#" rel="this is a test">

我需要用下划线替换 rel 属性中的空格,但我是一个正则表达式新手!

我正在使用 Textmate。

谁能帮帮我?

/雅各布

【问题讨论】:

  • 这对于只允许搜索和替换的文本编辑器来说并不容易。这是因为您需要一个模式来找到正确的位置(rel 属性),然后您需要一个模式来替换。
  • 我希望在另一个正则表达式中使用正则表达式的解决方案(如果这有意义的话)。因为你是对的,所以这场比赛是一种两遍解决方案。首先找到字符串: (rel=".*") 然后用 (_) 替换所有空格。也许这是不可能的?
  • @Jakob Madsen 您对递归的渴望是完全正确的,并且除非使用某些 Perl 扩展,正则表达式不能递归。这是正则表达式不擅长解析 HTML 和 XML 的原因之一。你需要一个解析器。
  • 嗯,我错过了你使用文本编辑器,那么你真正的选择是找到一个插件,让你 DOM 访问你正在处理的文档,或者编写一个快速脚本来做到这一点对你来说(可能是更好的选择,因为它很容易重复)
  • 只要你了解你的用户并且支持 JavaScript,我会用 JavaScript 来做。

标签: html regex replace textmate


【解决方案1】:

查找:(rel="[^\s"]*)\s([^"]*")

替换:\1_\2

这只会替换第一个空格,因此请单击“全部替换”,直到不再替换任何内容。它不是很漂亮,但很容易理解并且适用于每个编辑器。

如果您需要清除其他属性,请更改查找模式中的rel

【讨论】:

    【解决方案2】:

    我认为你不能正确地做到这一点。虽然我想知道为什么你需要一次性完成?

    我能想到一个非常糟糕的方法,但即使我不推荐它,这里是:

    你可以用下面的正则表达式来做。但是,您必须将捕获和输出的数量与 _ 结尾增加到 rel 中的潜在空格数。我敢打赌,这是不允许此解决方案的要求。

    搜索:

    {\<a *href\=\"[^\"]*" *rel\=\"}{([^ ]*|[^\"]*)}( |\")*{([^ ]*|[^\"]*)}( |\")*{([^ ]*|[^\"]*)}( |\")*{([^ ]*|[^\"]*)}( |\")*{([^ ]*|[^\"]*)}( |\")*{([^ ]*|[^\"]*)}( |\")*{([^ ]*|[^\"]*)}( |\")*{([^ ]*|[^\"]*)}( |\")*
    

    替换:

    \1\2_\3_\4_\5_\6_\7_\8_
    

    这种方式有两个缺点,一个是您可以在 Textmate 中捕获的数量可能会受到限制,二是您最终会在每行的末尾有大量的 _。

    使用您当前的测试,使用上面的正则表达式,您最终会得到:

    <a href="#" rel="this_is_a_test">____
    

    PS:这个正则表达式是 Visual Studio 搜索/替换框的格式。您可能需要更改一些字符以使其适合文本板。

     {} => capturing group
    
      () => grouping
    
      [^A] => anything but A
    
      ( |\")* => space or "
    
      \1 => is the first capture 
    

    【讨论】:

    • 嘿,谢谢!你给了我一些思考。你是绝对正确的。我不需要一口气做完。我找到了一种匹配第一个空格的方法,虽然它看起来有点像一个笑话: (? 我想我应该能够运行搜索/替换几次,直到它停止匹配。基本上一次替换一个空格: 问:如何避免重复[\w+]?它会匹配 _ 的吗?
    • 哇,评论吃掉了我的换行符......希望它仍然可读!
    • 谢谢!但是我在第一次运行时得到了这个结果: rel="this _is a test" 空格字符被匹配并插入到替换字符串中。之后删除空格应该很容易,但问题意味着我一直定位到相同的插入位置:rel="this _________is a test"
    • 听起来您将空间放在捕获组的内部而不是外部。它应该是 }space 而不是 space}
    【解决方案3】:

    假设你已经收到了 rel 的值:

    var value = document.getElementById(id).getAttribute( "rel");
    var rel = (new String( value)).replace( /\s/g,"_");
    document.getElementById(id).setAttribute( "rel", rel);
    

    【讨论】:

    • Upps,不知何故我错过了。 o_O
    【解决方案4】:

    正则表达式根本不擅长解析 HTML(请参阅 Can you provide some examples of why it is hard to parse XML and HTML with a regex? 了解原因)。您需要的是一个 HTML 解析器。有关使用各种解析器的示例,请参阅 Can you provide an example of parsing HTML with your favorite parser?

    【讨论】:

      【解决方案5】:

      我必须在这里接受“你为工作使用了错误的工具”的培训。你有 Textmate,所以这意味着 OSX,这意味着你有 sed、awk、ruby 和 perl,它们都可以更好、更容易地做到这一点。

      学习如何使用其中一种工具进行文本操作将在未来为您带来数不胜数的好处。这是一个可以让您轻松进入 sed 的 URL:http://www.grymoire.com/Unix/Sed.html

      【讨论】:

        【解决方案6】:

        如果您使用的是 TextMate,那么您使用的是 Mac,因此使用的是 Python。

        试试这个:

        #!/usr/bin/env python
        
        import re
        
        input = open('test.html', 'r')
        
        p_spaces = re.compile(r'^.*rel="[^"]+".*$')
        
        for line in input:
            matches = p_spaces.findall(line)
        
            for match in matches:
                new_rel = match.replace(' ', '_')
                line = line.replace(match, new_rel)
        
            print line,
        

        样本输出:

         $ cat test.html
        testing, testing, 1, 2, 3
        <a href="#" rel="this is a test">
        <unrelated line>
        Stuff
        <a href="#" rel="this is not a test">
        <a href="#" rel="this is not a test" rel="this is invalid syntax (two rels)">
        aoseuaoeua
        
         $ ./test.py
        testing, testing, 1, 2, 3
        <a_href="#"_rel="this_is_a_test">
        <unrelated line>
        Stuff
        <a_href="#"_rel="this_is_not_a_test">
        <a_href="#"_rel="this_is_not_a_test"_rel="this_is_invalid_syntax_(two_rels)">
        aoseuaoeua
        

        【讨论】:

        • 这会替换整行中的空格,而不仅仅是属性内部。
        猜你喜欢
        • 1970-01-01
        • 2010-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-08
        • 2011-09-03
        • 2017-04-05
        相关资源
        最近更新 更多