आप एक regex कुछ वीं की तरह उपयोग करते हुए, पर जोर देते हैं ज्यादातर मामलों में काम करेंगे जाता है:
# Remove all HTML except "p" tags
$html =~ s{<(?>/?)(?:[^pP]|[pP][^\s>/])[^>]*>}{}g;
स्पष्टीकरण:
s{
< # opening angled bracket
(?>/?) # ratchet past optional/
(?:
[^pP] # non-p tag
| # ...or...
[pP][^\s>/] # longer tag that begins with p (e.g., <pre>)
)
[^>]* # everything until closing angled bracket
> # closing angled bracket
}{}gx; # replace with nothing, globally
लेकिन वास्तव में, अपने आप को कुछ सिर दर्द बचाने के लिए और के बजाय एक पार्सर का उपयोग करें। सीपीएएन में कई मॉड्यूल हैं जो उपयुक्त हैं। यहाँ HTML::TokeParser मॉड्यूल कि अत्यंत सक्षम HTML::Parser CPAN वितरण के साथ आता है का उपयोग कर एक उदाहरण है:
use strict;
use HTML::TokeParser;
my $parser = HTML::TokeParser->new('/some/file.html')
or die "Could not open /some/file.html - $!";
while(my $t = $parser->get_token)
{
# Skip start or end tags that are not "p" tags
next if(($t->[0] eq 'S' || $t->[0] eq 'E') && lc $t->[1] ne 'p');
# Print everything else normally (see HTML::TokeParser docs for explanation)
if($t->[0] eq 'T')
{
print $t->[1];
}
else
{
print $t->[-1];
}
}
HTML::Parser एक फ़ाइल नाम, एक खुली फ़ाइल हैंडल या एक स्ट्रिंग के रूप में इनपुट स्वीकार करता है। उपरोक्त कोड को लाइब्रेरी में लपेटना और गंतव्य कॉन्फ़िगर करने योग्य बनाना (यानी, उपर्युक्त में केवल print
आईएनजी नहीं) मुश्किल नहीं है। परिणाम नियमित अभिव्यक्तियों का उपयोग करने की कोशिश करने से अधिक विश्वसनीय, रखरखाव योग्य और संभवतः तेज़ (HTML :: पार्सर सी-आधारित बैकएंड का उपयोग करता है) होगा।
स्रोत
2008-08-27 12:31:35
अपने HTML/Regex विचारों के लिए इस उत्तर को देखें - http://stackoverflow.com/questions/1732348/regex-मैच खुले टैग को छोड़कर-एक्सएचटीएमएल-संयमी-टैग/1732454 # 1 732454 –