我正在尝试使用以下正则表达式在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中执行此特定任务,但大多数部分都在那里.
强制警告:您不应该使用正则表达式来解析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>.)