2011-01-16 21 views
8

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

<h5>foo</h5> 
    <table> 
    <tbody> 
    </tbody> 
    </table> 

<h5>bar</h5> 
    <table> 
    <tbody> 
    </tbody> 
    </table> 

<h5>meow</h5> 
    <table> 
    <tbody> 
    </tbody> 
    </table> 

मैं जबकि अकेले स्ट्रिंग के बाकी छोड़ने <h2>something_else</h2> करने के लिए बस प्रत्येक पाठ की पहली <h5>foo</h5> ब्लॉक बदलने की जरूरत है।

रूबी का उपयोग करके उचित पीसीआरई रेगेक्स नहीं लग रहा है।

+2

मैं आपको HTML के लिए regex का उपयोग करने के बजाय एक HTML पार्सर का उपयोग करने पर विचार करने के लिए आग्रह करता हूं। जैसा कि यह कहा गया है [कई] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags), [कई] (http: // stackoverflow। कॉम/प्रश्न/590747/नियमित-अभिव्यक्ति-से-पार्स-एचटीएमएल-क्यों-नहीं), [कई] (http://stackoverflow.com/questions/6751105/why-its-not-possible-to-use -regex-to-parse-html-xml-a-formal-explanation-in-la? lq = 1) इससे पहले, रेगेक्स पार्सर्स HTML को सटीक रूप से पार्स करने में असमर्थ हैं। –

+0

विशेष रूप से, मैं अपने एचटीएमएल को लोड करने के लिए [नोकोगिरी] (http://nokogiri.org) का उपयोग करने की सलाह देता हूं, इसे कुशलतापूर्वक उपयोग करता हूं, और फिर परिणाम निकाल देता हूं। – Phrogz

उत्तर

31
# The regex literal syntax using %r{...} allows/in your regex without escaping 
new_str = my_str.sub(%r{<h5>[^<]+</h5>}, '<h2>something_else</h2>') 

String#subString#gsub के बजाय कारणों होने के लिये केवल पहले प्रतिस्थापन का उपयोग करना। आप गतिशील रूप से चयन करने के लिए क्या 'foo' है की जरूरत है, तो आप रेगुलर एक्सप्रेशन से शाब्दिक में स्ट्रिंग प्रक्षेप उपयोग कर सकते हैं: तब फिर

new_str = my_str.sub(%r{<h5>#{searchstr}</h5>}, "<h2>#{replacestr}</h2>") 

, अगर आप जानते हैं कि 'foo' है, तो आप एक regex की जरूरत नहीं है:

new_str = my_str.sub("<h5>searchstr</h5>", "<h2>#{replacestr}</h2>") 

या यहाँ तक कि:

:

my_str[ "<h5>searchstr</h5>" ] = "<h2>#{replacestr}</h2>" 

आप प्रतिस्थापन यह पता लगाने की कोड को चलाने के लिए की जरूरत है, आप उप के ब्लॉक का उपयोग कर सकते

new_str = my_str.sub %r{<h5>([^<]+)</h5>} do |full_match| 
    # The expression returned from this block will be used as the replacement string 
    # $1 will be the matched content between the h5 tags. 
    "<h2>#{replacestr}</h2>" 
end 
+0

उत्कृष्ट उत्तर, धन्यवाद – Alp

+0

मुझे बहुत मदद करें .. thanx – Jaydipsinh

2

नियमित अभिव्यक्ति <h5>[^<]+<\/h5> साथ उपयोग String.gsub:

>> current = "<h5>foo</h5>\n <table>\n <tbody>\n </tbody>\n </table>" 
>> updated = current.gsub(/<h5>[^<]+<\/h5>/){"<h2>something_else</h2>"} 
=> "<h2>something_else</h2>\n <table>\n <tbody>\n </tbody>\n </table>" 

ध्यान दें, यदि आप नियमित अभिव्यक्ति आराम से in your browser गहरे लाल रंग का परीक्षण कर सकते हैं।

+0

लिंक टूटा हुआ है। –

6

जब भी मुझे HTML या XML को पार्स या संशोधित करना होता है तो मैं एक पार्सर तक पहुंचता हूं। मैं लगभग regex या instring से परेशान नहीं करता जब तक कि यह बिल्कुल एक ब्रेनर नहीं है।

यहाँ कैसे Nokogiri का उपयोग कर यह करने के लिए, किसी भी regex के बिना है: चलाने के बाद

# >> <h5>foo</h5> 
# >> <table><tbody></tbody></table><h5>bar</h5> 
# >> <table><tbody></tbody></table><h5>meow</h5> 
# >> <table><tbody></tbody></table> 

यह वह जगह है:

text = <<EOT 
<h5>foo</h5> 
    <table> 
    <tbody> 
    </tbody> 
    </table> 

<h5>bar</h5> 
    <table> 
    <tbody> 
    </tbody> 
    </table> 

<h5>meow</h5> 
    <table> 
    <tbody> 
    </tbody> 
    </table> 
EOT 

require 'nokogiri' 

fragment = Nokogiri::HTML::DocumentFragment.parse(text) 
print fragment.to_html 

fragment.css('h5').select{ |n| n.text == 'foo' }.each do |n| 
    n.name = 'h2' 
    n.content = 'something_else' 
end 

print fragment.to_html 

पार्स करने के बाद, यह है कि क्या Nokogiri टुकड़ा से वापस आ गया है है

# >> <h2>something_else</h2> 
# >> <table><tbody></tbody></table><h5>bar</h5> 
# >> <table><tbody></tbody></table><h5>meow</h5> 
# >> <table><tbody></tbody></table> 
संबंधित मुद्दे