如何使用Perl删除除了空格之外只有空格的所有字体标记?

cri*_*sti 2 html regex perl

我正在尝试使用以下正则表达式在Perl中进行匹配:

s/<font(.*?)>[\t\f ]*<\/font>//gi;
Run Code Online (Sandbox Code Playgroud)

我想要它做的是删除所有内部没有任何东西的字体标签.

不幸的是,它<font在第一次之后不会停止,>直到>之前</font>.

有关正则表达式有什么问题的指示?

my $text1 = '<font color="#008080"><span style="background: #ffffff"></span></font>';
my $text2 = '<font color="#008080">    s</font>';
my $text2 = '<font></font>';
$text1 =~ s/<font(.*?)>[\t\f ]*<\/font>//gi;
$text2 =~ s/<font(.*?)>[\t\f ]*<\/font>//gi;
$text3 =~ s/<font(.*?)>[\t\f ]*<\/font>//gi;
print "$text1\n$text2\n$text3\n";
Run Code Online (Sandbox Code Playgroud)

将打印

 
<font>s</font>
 
Run Code Online (Sandbox Code Playgroud)

bri*_*foy 11

如果您使用的是XHTML,那么使用XML :: Twig非常简单:

use XML::Twig;

my $string = <<"HTML";
<?xml version="1.0"?>
<html>
<font color="#008080"><span style="background: #ffffff"></span></font>
<font color="#008080">    s</font>
<font></font>
</html>
HTML

use XML::Twig;
my $twig = XML::Twig->new( 
    pretty_print => 'nice',
    twig_handlers => {
        span => \&delete_empty,
        font => \&delete_empty,
        },
    );
$twig->parse( $string );

$twig->print;

sub delete_empty {
    my( $twig, $element ) = @_;

    $element->delete unless $element->text =~ /\S/;
    }
Run Code Online (Sandbox Code Playgroud)

你也可以使用HTML :: Tree,但我现在没有时间写一个例子(现在我已经做了,Greg Bacon已经做过了).我没有向您展示如何使用InformIT 的Perl模块文章在我的Process HTML中执行此特定任务,但大多数部分都在那里.


ken*_*ytm 5

强制警告:您不应该使用正则表达式来解析HTML.


虽然.*?是懒惰,但并不意味着它会避免匹配成功.在$ text1中,

<font color="#008080"><span style="background: #ffffff"></span></font>
Run Code Online (Sandbox Code Playgroud)

因此能够以匹配<font(.*?)>[\t\f ]*<\/font>由具有.*?匹配" color="#008080"><span style="background: #ffffff"></span".这是最短的匹配,将导致匹配成功.

如果你想在第一个停止>,请使用

s|<font[^>]*>\s*</font>||gi
#      ^^^^
Run Code Online (Sandbox Code Playgroud)

这假设>不会出现在<font>标签内.(违规示例:<font onclick="return 1>2"></font>.)