从内联CSS中删除特定规则

时间:2009-11-26 14:38:21

标签: css regex

我想从内联样式属性中删除一些特定的css规则(即宽度和高度)。

所以我想改变以下内容:

<table id="foo" style="border:1px #000 solid; width: 100px; height: 100px;">

<table id="foo" style="border:1px #000 solid">

有一个方便的正则表达式可以解决我的问题吗?

提前谢谢大家

5 个答案:

答案 0 :(得分:0)

您的问题不是很具体,但/[\s;"']width: .+;/怎么样?你需要将它提供给替换函数或其他东西,但我无法帮助你,因为我不知道你在用什么语言。

答案 1 :(得分:0)

不,你通常不能在正则表达式中完成所有这些,因为HTML不是常规语言。

使用HTML解析器从style标记获取table属性,然后使用正则表达式width:.+?(;|$)height:.+?(;|$)

答案 2 :(得分:0)

在编辑器中启用正则表达式搜索,然后尝试:

width="[^"]*"
height="[^"]*"

答案 3 :(得分:0)

也许尝试这个(在Vim和Ruby中测试):

/(width|height):\s*\d+(px|%);?//

当然你应该使用编辑器(或语言)的regexp语法(例如在Vim中你必须在'(','|',')'和'+'之前加上反斜杠

答案 4 :(得分:0)

注意:正则表达式无法正确解析HTML。

改为使用解析器。

#! /usr/bin/perl

use warnings;
use strict;

use HTML::Parser;

die "Usage: $0 html-file\n" unless @ARGV == 1;

sub start {
  my($tag,$attr,$attrseq,$text,$skipped) = @_;

  print $skipped;
  unless ($attr->{style} && $attr->{style} =~ /width|height/) {
    print $text;
    return;
  }

  my %style = $attr->{style} =~ /
    \s*      # optional leading space
    (.+?) :  # property, e.g., width
    \s*      # optional separating space
    ([^;]+)  # value, e.g., 100px
    ;?       # optional separator
  /gx;

  delete @style{qw/ width height /};
  $attr->{style} = join "; " =>
                   map "$_: $style{$_}",
                   keys %style;

  print "<$tag ",
          join(" " => map qq[$_="$attr->{$_}"], @$attrseq),
        ">";
}

my $p = HTML::Parser->new(
  api_version => 3,
  marked_sections => 1,
  start_h => [ \&start => "tag, attr, attrseq, text, skipped_text" ],
  end_h => [ sub { print @_ } => "skipped_text, text" ],
);

undef $/;
$p->parse(<>);