2010-02-05 13 views
9

मैंनियमित अभिव्यक्ति lookbehind समस्या

(?<!value=\")##(.*)## 

## MyString ## कि के रूप में नहीं है की तरह स्ट्रिंग के मिलान का उपयोग करें:

<input type="text" value="##MyString##"> 

यह ऊपर दिए गए फ़ॉर्म के लिए काम करता है, लेकिन नहीं इसके लिए: (यह अभी भी मेल खाता है, मेल नहीं करना चाहिए)

<input type="text" value="Here is my ##MyString## coming.."> 

मैंने कोशिश की:

(?<!value=\").*##(.*)## 

कोई किस्मत के साथ। किसी भी सुझाव की सराहना की जाएगी।

संपादित करें: मैं PHP preg_match() फ़ंक्शन

+1

एचटीएमएल पार्स करने के लिए रेगेक्स का उपयोग न करें - एक HTML पार्सर का उपयोग करें। http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

+1

आप किस भाषा का उपयोग कर रहे हैं? –

+0

मैं PHP का उपयोग कर रहा हूँ। –

उत्तर

4

यह एकदम सही (कि क्या एचटीएमएल पारसर्स के लिए कर रहे है) नहीं है, लेकिन यह HTML फ़ाइलों के विशाल बहुमत के लिए काम करेंगे:

(^|>)[^<>]*##[^#]*##[^<>]*(<|$) 

विचार सरल है। आप एक स्ट्रिंग की तलाश में हैं जो टैग के बाहर है। टैग के बाहर होने के लिए, निकटतम एंग्लेड ब्रैकेट को बंद करना होगा (या बिल्कुल कोई ब्रैकेट नहीं है), और सबसे नज़दीक निम्नलिखित खोलना चाहिए (या कोई नहीं)। यह मानता है कि एंग्लेड ब्रैकेट का उपयोग विशेषता मानों में नहीं किया जाता है।

value\s*=\s*"([^\"]|\\\")*##[^#]*##([^\"]|\\\")*\" 

... और फिर बस मैच (!preg_match(...)) नकारना:

आप वास्तव में परवाह है कि विशेषता नाम "मूल्य" हो, तो आप मेल कर सकते हैं।

+0

धन्यवाद, यह बहुत करीब है –

0
यहाँ

उपयोग कर रहा हूँ एक प्रारंभिक बिंदु के कम से कम वह दिए गए उदाहरण के लिए काम करता है।

(?<!<[^>]*value="[^>"]*)##(.*)## 
+0

चेतावनी: preg_match(): संकलन विफल: देखें कि दावे की लंबाई तय नहीं है –

+0

यह विफल रहता है "संकलन विफल: देखें कि 23 का ऑफसेट पर निश्चित लंबाई तय नहीं है" मैं PHP preg_match फ़ंक्शन –

+0

का उपयोग कर रहा हूं @ निशान, मुझे लगता है। नेट इस तरह के दिखने का समर्थन करने वाला एकमात्र इंजन है, अब आप इसका जिक्र करते हैं! मैं स्वीकार करता हूं कि यह समस्या वास्तव में किसी भी अन्य भाषा में बहुत चुनौतीपूर्ण है, ऊपर दिया गया मेरा बिंदु विशेष रूप से आपके लिए लक्षित नहीं था, वास्तव में आप वास्तव में इस मामले में सही हैं, लेकिन मैं अभी भी कहता हूं कि बहुत से लोग बिना समझ के बैंडविंगन पर कूदते हैं। –

1

@OP, आप इसे बिना किसी रेगेक्स के कर सकते हैं।

$text = '<input type="text" value=" ##MyString##">'; 
$text = str_replace(" ","",$text); 
if (strpos($text,'value="##') !==FALSE){ 
    $s = explode('value="##',$text); 
    $t = explode("##",$s[1]); 
    print "$t[0]\n"; 
} 
+0

मेरा मानना ​​है कि इसमें बहुत अधिक उपर है। जब इसे बदलने की बात आती है, तो हम 50 स्ट्रिंग्स कहें, यह बहुत अधिक संसाधन का उपभोग करेगा। और यह ## MyString ## से पहले हमेशा सफेद जगह नहीं है, यह कुछ भी –

+0

हो सकता है यदि यह कुछ भी है लेकिन '## Mystring ##' से पहले रिक्त स्थान पर है, तो यह आपके मानदंडों के अनुसार सही नहीं होना चाहिए? ओवरहेड्स के लिए, बताने का कोई तरीका नहीं है जब तक आप कुछ मानक नहीं करते। – ghostdog74

+0

@Dali अधिक कोड का मतलब अधिक ओवरहेड नहीं है, यह समाधान कुछ परिस्थितियों में रेगेक्स से भी तेज हो सकता है और दूसरों में धीमा हो सकता है, क्योंकि ghostdog74 कहता है, आपको वास्तव में इसे आजमाने की ज़रूरत है। –

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