池上是正確的,你真的應該至少使用一個HTML/XML解析器來完成這項任務。我個人喜歡使用Mojo::DOM
解析器。這是一個文檔對象模型接口到您的HTML和它支持CSS3 selectors,使它真正靈活,當你需要它。這是一個非常簡單的一個爲它不過:
#!/usr/bin/env perl
use strict;
use warnings;
use Mojo::DOM;
my $content = <<'END';
<html>
<head> <title> Example </title> </head>
<style>
p{color: red;
background-color: #FFFF;
}
div {......
...
}
</style>
<body>
<p> hi I'm a paragraph. </p>
</body>
</html>
END
my $dom = Mojo::DOM->new($content);
$dom->find('style')->pluck('remove');
print $dom;
的pluck
方法是有點混亂,但它其實只是每個結果對象上執行的方法的簡寫。類似的行可能是
$dom->find('style')->each(sub{ $_->remove });
這是一個更容易理解,但不太可愛。
閱讀你的編輯,你必須處理後,更多的只是你的基本形式,我要進一步強調,這就是爲什麼你使用的解析器修改HTML而不是讓你的正則表達式增長到荒謬的比例。
現在讓我們說,$content
變量也包含這些線路
<link rel="stylesheet" type="text/css" href="$url_path/gridsorting.css">
<link rel="icon" href="somefile.jpg">
要刪除第一個
,而不是第二。您可以通過以下兩種方式之一來完成此操作。
$dom->find('link')->each(sub{ $_->remove if $_->{rel} eq 'stylesheet' });
該機制使用的對象的方法(和魔:: DOM暴露屬性作爲哈希鍵)只除去link
標籤具有rel=stylesheet
。但是,您可以使用CSS3選擇器只find
這些元素,但是,因爲魔:: DOM具有完全CSS3選擇器支持,你可以做
$dom->find('link[rel=stylesheet]')->pluck('remove');
CSS3選擇器陳述可以用逗號連接到既找不到匹配的所有標籤選擇器,所以我們可以簡單的包含這行
$dom->find('style, link[rel=stylesheet]')->pluck('remove');
並且一舉擺脫你所有的攻勢樣式表!
它看起來像你正在尋找處理正則表達式HTML。這是一個[令人驚訝的不好主意](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags)! –