2012-06-13 12 views
5

मैं वर्तमान में HTML पाठ का एक बड़ा बैच है मैच और मैं कई सीएसएस गुण है जो निम्न के समान है:नियमित अभिव्यक्ति एक एकल सीएसएस संपत्ति

font:16px/normal Consolas; 
font:16px/normal Arial; 
font:12px/normal Courier; 

जो भी कई अन्य सीएसएस गुण और अन्य संबद्ध साथ आ जाते हैं एचटीएमएल मूल्य और टैग।

मैं एक नियमित अभिव्यक्ति है कि केवल इन "फ़ॉन्ट शैली" हड़पने होगा लिखने की कोशिश कर रहा है, इसलिए यदि मैं निम्नलिखित दो पैराग्राफ था:

<p style='font:16px/normal Arial; font-weight: x; color: y;'>Stack</p> 
<span style='color: z; font:16px/normal Courier;'>Overflow</span> 
<br /> 
<div style='font-family: Segoe UI; font-size: xx-large;'>Really large</div> 

यह केवल गुण font: के साथ शुरुआत से मेल खाएगा और अर्धविराम ; के साथ समाप्त होता है।

मैं RegexHero का उपयोग कर के आसपास खेला है और निकटतम मैं मिल गया है था:

\b(?:font[\s*\\]*:[\s*\\]*?(\b.*\b);) 

जो निम्नलिखित परिणाम सामने आए:

font:bold;     //Match 
font:12pt/normal Arial;  //Match 
font:16px/normal Consolas; //Match 
font:12pt/normal Arial;  //Match 
property: value;    //Not a Match 
property: value value value; //Not a Match 

लेकिन जब मैं का एक बड़ा ब्लॉक में ड्रॉप करने का प्रयास किया एचटीएमएल, चीजें उलझन में लग रही थीं और बड़े ब्लॉक को पहले निर्दिष्ट सीमाओं के बजाय चुना गया था।

मुझे कोई अतिरिक्त जानकारी और परीक्षण डेटा प्रदान करने में खुशी होगी जो मैं कर सकता हूं।

+0

क्या आप सटीक मिलान प्राप्त करने के लिए delimiters का उपयोग नहीं करना चाहिए? कुछ जैसे^(\ b (?: फ़ॉन्ट [\ s * \\] *: [\ s * \\] *? (\ B। * \ B);)) $ – pollirrata

उत्तर

4

आपने .* लालची छोड़ी है, जिसका अर्थ है कि यह खाएगा और खाएगा और केवल अंतिम अर्धविराम उपलब्ध होगा। एक गैर-लालची बनाने के लिए एक प्रश्न चिह्न जोड़ें, यानी .*?

अपडेट किया गया:

\b(?:font\s*?:\s*([^;>]*?)(?=[;">}])) 

मैं http://rubular.com/r/yRcED2n6wu पर यह पेज पर हर उदाहरण परीक्षण किया है।

+0

धन्यवाद acheong87। मैं नियमित अभिव्यक्तियों के बारे में पर्याप्त नहीं सीख सकता। –

+0

ध्यान दें कि 'फ़ॉन्ट: संस-सेरिफ़ 80%;' कभी मेल नहीं खाएगा। – Qtax

+0

धन्यवाद @Qtax! मैंने अपना जवाब अपडेट कर लिया है। –

0

मुझे पूरा यकीन नहीं है कि आप क्या पूछ रहे हैं, लेकिन मुझे लगता है कि इस समस्या को आपके स्टाइल टैग को सीएसएस के साथ बदलकर हल किया जा सकता है। समस्या को आपके एचटीएमएल के हेड टैग में निम्नलिखित रखकर हल किया जा सकता है।

<style type="text/css"> 

h1 { 

    font-family: Arial; 
    font-size: 15; 
    font-style:oblique; 

} 

h2 { 
    font-family: Courier; 
    font-size: 16; 
    font-style:oblique; 
} 
h3 { 
    font-family: Segoe UI; 
    font-size: xx-large; 
    font-style:oblique; 
} 


</style> 

अब, तुम सब एक अभिव्यक्ति (या अपने आप को) बनाने के लिए क्या करना है सेट इन फ़ॉन्ट शैली में से एक तो की तरह एक टैग के साथ उसके दोनों ओर के लिए है:

<h1> Cool Text! </h1> 

गुड लक!

+0

दुख की बात है - इस मामले में मेरे पास इनपुट पर नियंत्रण नहीं है। –

+0

आप एक PHP या जावास्क्रिप्ट कोड लिखकर इनपुट का "नियंत्रण" ले सकते हैं जो इन्हें सामने ही जोड़ता है। यह काफी सरल होगा। – user1453967

2

इस RegEx का प्रयास करें:

(?:font:[^;]*); 

यह ऊपर अपने टुकड़ा से font:16px/normal Arial; और font:16px/normal Courier; मेल खाता है।

+0

धन्यवाद बैरी - यह अब तक काम करता प्रतीत होता है। (और आमतौर पर मैं हमेशा नियमित अभिव्यक्तियों को जटिल बनाने पर महसूस करता हूं) –

+1

यह विफल हो जाएगा यदि फ़ॉन्ट शैली अपने समूह में आखिरी है और अर्धविराम से बंद नहीं है। –

4

मेरा सुझाव है कि हम इस

\b((?:font:[^;]*?)(?:;|')) 

स्पष्टीकरण

\b    # Assert position at a word boundary 
(    # Match the regular expression below and capture its match into backreference number 1 
    (?:   # Match the regular expression below 
     font:   # Match the characters “font:” literally 
     [^;]   # Match any character that is NOT a “;” 
     *?    # Between zero and unlimited times, as few times as possible, expanding as needed (lazy) 
    ) 
    (?:   # Match the regular expression below 
        # Match either the regular expression below (attempting the next alternative only if this one fails) 
     ;    # Match the character “;” literally 
     |    # Or match regular expression number 2 below (the entire group fails if this one fails to match) 
     &apos;    # Match the character “&apos;” literally 
    ) 
) 
+0

धन्यवाद साइलियन - यह काम करता है साथ ही, और स्पष्टीकरण काफी उपयोगी है। –

+0

@RionWilliams: आपका स्वागत है। – Cylian

1

का प्रयास करें:

\bfont\s*:\s*([^;}"'<>]+)(?<=\S) 

कौन सा भी मामलों में जहां अन्य उत्तर असफल के लिए काम करेंगे। उदाहरण के लिए:

.foo { font: sans-serif 80% } 
... style="font: sans-serif 80%" ... 
+0

मैंने आपके सुधार के लिए आपको वोट दिया। धन्यवाद। –

+0

@ acheong87, t धन्यवाद, मैं आपकी टिप्पणी से पहले ही आपको +1 कर चुका हूं। :-) – Qtax

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