2010-06-08 23 views
9

को छोड़कर एचटीएमएल विशेषताओं को स्ट्रिप करें मैं एक नियमित अभिव्यक्ति लिखने की कोशिश कर रहा हूं जो एसआरसी विशेषता को छोड़कर सभी टैग विशेषताओं को पट्टी कर देगा। उदाहरण के लिए:रेगेक्स: एसआरसी

<p>This is a paragraph with an image <img src="/path/to/image.jpg" /></p> 

मैं सभी विशेषताओं पट्टी करने के लिए एक नियमित अभिव्यक्ति है, लेकिन मैं यह बदलाव करने src में छोड़ने के लिए कोशिश कर रहा हूँ:

<p id="paragraph" class="green">This is a paragraph with an image <img src="/path/to/image.jpg" width="50" height="75"/></p> 

के रूप में लौटा दिया जाएगा। यहां मेरे पास अब तक है:

<?php preg_replace('/<([A-Z][A-Z0-9]*)(\b[^>]*)>/i', '<$1>', '<html><goes><here>'); 

इसके लिए PHP के preg_replace() का उपयोग करना।

धन्यवाद! इयान

+1

आप रेगुलर एक्सप्रेशन का उपयोग करके HTML पार्स कर सकते हैं। सभी एचटीएमएल नहीं।लेकिन अगर आपको पता है कि आप क्या प्राप्त कर रहे हैं तो आप नियमित अभिव्यक्तियों का उपयोग कर सकते हैं। यह उन लोगों द्वारा शुरू किया गया एक धार्मिक युद्ध है जो मानते हैं कि सभी स्थितियों में अनंत ढेर और स्मृति उपलब्ध हैं। –

उत्तर

1

ठीक देता है, यहाँ मैं क्या इस्तेमाल किया है कि अच्छी तरह से काम कर रहा है है इसमें किसी भी छेद को दबाओ।

7

Youusuallyshould not parse HTML using regular expressions

इसके बजाय, आपको DOMDocument::loadHTML पर कॉल करना चाहिए।
फिर आप दस्तावेज़ में तत्वों के माध्यम से पुन: सेवा कर सकते हैं और removeAttribute पर कॉल कर सकते हैं।

+5

कुछ लोग, जब किसी समस्या का सामना करते हैं, तो सोचें "मुझे पता है, मैं नियमित अभिव्यक्तियों का उपयोग करूंगा।" अब उन्हें दो समस्याएं हैं। – fmark

+2

आप नियमित अभिव्यक्तियों का उपयोग करके HTML को पार्स कर सकते हैं। सभी एचटीएमएल नहीं। लेकिन अगर आपको पता है कि आप क्या प्राप्त कर रहे हैं तो आप नियमित अभिव्यक्तियों का उपयोग कर सकते हैं। यह उन लोगों द्वारा शुरू किया गया एक धार्मिक युद्ध है जो मानते हैं कि सभी स्थितियों में अनंत ढेर और स्मृति उपलब्ध हैं। –

+5

कुछ लोगों के पास इस सवाल का जवाब देने और मंत्रों के बारे में जुनून करने की एक भयानक आदत है। इसे धार्मिक अधिकार से उखाड़ फेंक दिया जाना चाहिए था। –

1

दुर्भाग्य से मुझे यकीन नहीं है कि PHP के लिए इस प्रश्न का उत्तर कैसे दिया जाए। अगर मैं पर्ल उपयोग कर रहे थे मैं निम्नलिखित करना होगा:

<([A-Z][A-Z0-9]*)(\b[^>src]*)(src\=[\'|"|\s]?[^\'][^"][^\s]*[\'|"|\s]?)?(\b[^>]*)> 

के लिए स्वतंत्र महसूस:

use strict; 
my $data = q^<p id="paragraph" class="green">This is a paragraph with an image <img src="/path/to/image.jpg" width="50" height="75"/></p>^; 

$data =~ s{ 
    <([^/> ]+)([^>]+)> # split into tagtype, attribs 
}{ 
    my $attribs = $2; 
    my @parts = split(/\s+/, $attribs); # separate by whitespace 
    @parts = grep { m/^src=/i } @parts; # retain just src tags 
    if (@parts) { 
     "<" . join(" ", $1, @parts) . ">"; 
    } else { 
     "<" . $1 . ">"; 
    } 
}xseg; 

print($data); 

जो

<p>This is a paragraph with an image <img src="/path/to/image.jpg"></p> 
11

यह आपकी आवश्यकताओं के लिए काम कर सकते हैं:

$text = '<p id="paragraph" class="green">This is a paragraph with an image <img src="/path/to/image.jpg" width="50" height="75"/></p>'; 

echo preg_replace("/<([a-z][a-z0-9]*)(?:[^>]*(\ssrc=['\"][^'\"]*['\"]))?[^>]*?(\/?)>/i",'<$1$2$3>', $text); 

// <p>This is a paragraph with an image <img src="/path/to/image.jpg"/></p> 

RegExp टूट:

/    # Start Pattern 
<    # Match '<' at beginning of tags 
(   # Start Capture Group $1 - Tag Name 
    [a-z]   # Match 'a' through 'z' 
    [a-z0-9]*  # Match 'a' through 'z' or '0' through '9' zero or more times 
)    # End Capture Group 
(?:   # Start Non-Capture Group 
    [^>]*   # Match anything other than '>', Zero or More Times 
    (   # Start Capture Group $2 - ' src="...."' 
    \s   # Match one whitespace 
    src=   # Match 'src=' 
    ['"]   # Match ' or " 
    [^'"]*  # Match anything other than ' or " 
    ['"]   # Match ' or " 
)    # End Capture Group 2 
)?   # End Non-Capture Group, match group zero or one time 
[^>]*?  # Match anything other than '>', Zero or More times, not-greedy (wont eat the /) 
(\/?)   # Capture Group $3 - '/' if it is there 
>    # Match '>' 
/i   # End Pattern - Case Insensitive 

कुछ के हवाले से जोड़ें, और प्रतिस्थापन पाठ <$1$2$3> का उपयोग यह अच्छी तरह से किसी भी गैर src= गुण पट्टी चाहिए गठित एचटीएमएल टैग।

यह आवश्यक रूप से पर सभी इनपुट काम करने के लिए नहीं जा रहा है कृपया ध्यान दें, के रूप में विरोधी HTML + RegExp लोगों को इतनी चतुराई से नीचे ध्यान देने योग्य बात कर रहे हैं। कुछ फ़ॉलबैक, सबसे विशेष रूप <p style=">"><p>"> अंत और कुछ अन्य टूटा मुद्दों है ... मैं एक पूर्ण प्रमाण टैग के रूप में Zend_Filter_StripTags देखने की सलाह देते हैं कर रहे हैं/पीएचपी

+0

जब तक एक विशेषता मान में '>' प्रकट नहीं होता है। बुराई एचटीएमएल पार्सिंग _hard_ है। इसके अलावा, आप '\ 'से बचने के लिए भूल गए। – SLaks

+0

जो मैं बचाना भूल गया था? अभिव्यक्ति के एक महान स्पष्टीकरण के लिए – gnarf

+0

+1। – Anthony

0

में फिल्टर विशेषताओं की शुरुआत की ऊपर के रूप में आप के लिए regex का उपयोग नहीं करना चाहिए पार्स एचटीएमएल, या एक्सएमएल।

मैं str_replace() के साथ आपका उदाहरण करूंगा; अगर यह सब समय एक ही है।

$str = '<p id="paragraph" class="green">This is a paragraph with an image <img src="/path/to/image.jpg" width="50" height="75"/></p>'; 

$str = str_replace('id="paragraph" class="green"', "", $str); 

$str = str_replace('width="50" height="75"',"",$str); 
0

पोस्टिंग ओरेकल Regex

के लिए एक समाधान प्रदान करने के लिए
<([^!][a-z][a-z0-9]*)([^>]*(\ssrc=[''''\"][^''''\"]*[''''\"]))?[^>]*?(\/?)> 
संबंधित मुद्दे