2009-07-01 13 views
8

क्या पर्ल का उपयोग कर स्ट्रिंग से HTML को स्ट्रिप करने के लिए वैसे भी आसान है?पर्ल का उपयोग कर स्ट्रिंग में एचटीएमएल कैसे लगा सकता हूं?

$Error_Msg =~ s|<b>||ig; 
$Error_Msg =~ s|</b>||ig; 
$Error_Msg =~ s|<h1>||ig; 
$Error_Msg =~ s|</h1>||ig; 
$Error_Msg =~ s|<br>||ig; 

मैं दोनों नियमित अभिव्यक्तियों को कम कर दूंगा, उदाहरण के लिए कुछ इस तरह:

$Error_Msg =~ s|</?[b|h1|br]>||ig; 

वहाँ एक मौजूदा पर्ल समारोह है कि एक स्ट्रिंग से किसी भी/सभी HTML स्ट्रिप्स है, भले ही मैं केवल bolds, h1 हेडर और br छीन की ज़रूरत है?

उत्तर

18

कोड मान लिया जाये कि मान्य HTML (कोई आवारा < या> ऑपरेटरों) है

आप केवल bolds, h1 के और br के

$htmlCode =~ s#</?(?:b|h1|br)\b.*?>##g 

और तुम विचार करना चाह सकते दूर करने के लिए की जरूरत है HTML::Strip मॉड्यूल

+5

मैं शायद नहीं कहूंगा, मैं कहूंगा। रेगेक्स के साथ एचटीएमएल को स्वच्छ करने का प्रयास इस दिन और उम्र में बेतुका है। सीपीएएन से कई HTML स्वच्छता मॉड्यूल में से एक का उपयोग करें, अधिमानतः एक्सएसएस कमजोरियों को रोकने के लिए डिज़ाइन किया गया कुछ और डैनियल म्यूई द्वारा लिखित नहीं। –

+2

एचटीएमएल से सावधान रहें :: स्ट्रिप यूटीएफ -8 एन्कोडेड तारों का सही ढंग से समर्थन नहीं करता है।वर्कअराउंड के लिए यहां देखें https://gist.github.com/910818 – nick

14

perlfaq9: How do I remove HTML from a string?

से

सबसे सही तरीका (यद्यपि सबसे तेज़ नहीं) HTML :: पार्सर का उपयोग सीपीएएन से करना है। एचटीएमएल :: फॉर्मेटटेक्स्ट का उपयोग करने का एक और अधिक सही तरीका है जो न केवल HTML को हटाता है बल्कि परिणामी सादे पाठ के थोड़ा सरल स्वरूपण करने का भी प्रयास करता है।

कई लोग एस/< जैसे * * // // // जी के साथ एक साधारण दिमागी नियमित अभिव्यक्ति दृष्टिकोण का प्रयास करते हैं, लेकिन यह कई मामलों में विफल रहता है क्योंकि टैग लाइन ब्रेक पर जारी रह सकते हैं, उनमें उद्धृत कोण-ब्रैकेट हो सकते हैं, या एचटीएमएल टिप्पणी मौजूद हो सकती है। इसके अलावा, लोग इकाइयों को परिवर्तित करना भूल जाते हैं - उदाहरण के लिए <।

#!/usr/bin/perl -p0777 
s/<(?:[^>'"]*|(['"]).*?\1)*>//gs 

आप एक अधिक पूर्ण समाधान चाहते हैं, http://www.cpan.org/authors/id/T/TO/TOMC/scripts/striphtml.gz में 3 चरण striphtml कार्यक्रम देखें:

यहाँ एक "सरल दिमाग" दृष्टिकोण है कि ज्यादातर फ़ाइलों के लिए काम करता है।

<IMG SRC = "foo.gif" ALT = "A > B"> 

<IMG SRC = "foo.gif" 
ALT = "A > B"> 

<!-- <A comment> --> 

<script>if (a<b && a>c)</script> 

<# Just data #> 

<![INCLUDE CDATA [ >>>>>>>>>>>> ]]> 

हैं एचटीएमएल टिप्पणी अन्य टैग में शामिल हैं, उन समाधानों भी पाठ पर इस तरह टूट जाएगा:

<!-- This section commented out. 
    <B>You can't see me!</B> 
--> 
+0

अपनी स्क्रिप्ट सुझाव के लिए - http://www.cpan.org/authors/id/T/TO/TOMC/scripts/striphtml.gz - यह सब कुछ हटा देता है। मैं केवल कुछ HTML टैग छोड़ने के लिए इस कोड को कैसे संशोधित कर सकता हूं? इसके अलावा यह अच्छी तरह से काम करता है। – PKHunter

14

यहाँ कुछ मुश्किल स्थितियों पर आप जब एक समाधान चुनने के बारे में सोचना चाहिए कि कर रहे हैं आपको निश्चित रूप से HTML::Restrict पर एक नज़र डालना चाहिए जो आपको एचटीएमएल टैग को अनुमति देने या प्रतिबंधित करने की अनुमति देता है। एक न्यूनतम उदाहरण दूर स्ट्रिप्स कि सभी HTML टैग:

use HTML::Restrict; 

my $hr = HTML::Restrict->new(); 
my $processed = $hr->process('<b>i am bold</b>'); # returns 'i am bold' 

मैं क्योंकि it breaks utf8 encoding एचटीएमएल :: पट्टी से दूर रहने की सलाह देते हैं।

+0

इच्छा है कि मैं कुछ हफ्ते पहले इस जवाब को पढ़ूंगा। – Steven

+0

यह पर्ल 5.8.x के साथ काम नहीं करता है। यह एक सुपर प्रोग्राम है, लेकिन यह जानना अच्छा होगा कि इसकी समर्थन संरचना क्या है। – PKHunter

+0

इसके अलावा मुझे यकीन नहीं है कि टैग (स्वीकार्य टैग) छोड़ने का कोई तरीका है जिसमें खुले और करीबी टैग नहीं हैं। उदाहरण '
' पहचानना मुश्किल है। – PKHunter

संबंधित मुद्दे

 संबंधित मुद्दे