我正在尝试编写一个从 XML标记中删除空格的perl脚本,但在值内留下空格.例如,假设我有: ExampleThis is an example./Exampl e 我想要完成的是在 / Exampl e中专门敲掉空白.由于这将处理整个XML文档
<Example>This is an example.</Exampl e>
我想要完成的是在< / Exampl e>中专门敲掉空白.由于这将处理整个XML文档,我想我会使用替换运算符做一些事情,但我无法弄清楚如何只匹配可能在XML标记本身内部的空格.
任何帮助是极大的赞赏!
编辑:我添加了一个真实的例子:
not well-formed (invalid token) at line 42, column 25, byte 1456: <Artist>Eminem</Artist> <FileName>eminem feat lil wayne - no love - hotnewhiphop com(2).mp3</ FileName> ========================^ <FileSize>4804478</FileSize>
s!(</?\w+)\s+(\w+\s+/?>)!$1$2!g;
如果要在带有属性的标记中实际留下空格,则会变得更复杂,因为空格是标记中的合法字符.你几乎必须在他们之后找到没有等于或等于空格的“单词”并将它们与之前的 – 未加引号的单词结合起来.
sub marry_inner_splits { my $_ = shift; # fix broken tags s|^/?(\w+)\s+(\w+)\b(?!\s*=)|$1$2|; # find the resulting position. my $pos = index( $_, ' ' ); # return if there is no whitespace. return $_ if $pos == -1; # bind the rest of the text to the substring substr( $_, $pos ) =~ s/(\s*\w+)\s+(\w+\s*=\s*(?:"[^"]+"|'[^']+')\s*)/$1$2/g; return $_; } my $tag_str = q{Some stuff before the tag <ta g attr1="val1" att r2="value #2" /></Escap e>}; $tag_str =~ s/<([^>]+)>/'<' . marry_inner_splits($1) . '>'/ge;
e标志表示您在更换部件中* eval * -ing.