2010-01-27 9 views
7

में अतिरिक्त बैकस्लैश आवश्यक है another user's question के उत्तर का परीक्षण करते समय मुझे कुछ ऐसा नहीं मिला जो मुझे समझ में नहीं आया। समस्या एक ही स्थान के साथ एक स्ट्रिंग से सभी शाब्दिक \t\n\r वर्णों को प्रतिस्थापित करना था।PHP regexp पैटर्न

अब, पहले पैटर्न मैंने कोशिश की थी:

/(?:\\[trn])+/ 

जो आश्चर्यजनक रूप से काम नहीं किया। मैंने पर्ल में एक ही पैटर्न की कोशिश की और यह ठीक काम किया। कुछ परीक्षण और त्रुटि के बाद मैंने पाया कि पीएचपी चाहता है 3 या 4 बैकस्लैश के लिए उस पैटर्न मिलान करने के लिए, के रूप में:

/(?:\\\\[trn])+/ 

या

/(?:\\\[trn])+/ 

इन पैटर्न - मेरे आश्चर्य - दोनों काम करते हैं। इन अतिरिक्त बैकस्लैश क्यों आवश्यक हैं?

+1

पर्ल regexes भाषा में एकीकृत कर रहे हैं करना चाहिए। –

उत्तर

12

आप regex में 1 का प्रतिनिधित्व करने के लिए 4 बैकस्लैश की जरूरत है क्योंकि:

  • 2 बैकस्लैश एक स्ट्रिंग में न छोड़ने के लिए उपयोग किया जाता है ("\\\\" -> \\)
  • 1 बैकस्लैश regex इंजन में न छोड़ने के लिए प्रयोग किया जाता है (\\ -> \)

पीएचपी दस्तावेज़ में

बचने किसी अन्य चरित्र बैकस्लैश का परिणाम देगा \\\[ के लिए 1

इसलिए भी मुद्रित किया जा रहा,

  • 1 बैकस्लैश \ न छोड़ने के लिए प्रयोग किया जाता है, एक रहने क्योंकि \[ अमान्य है ("\\\[" -> \\[)
  • 1 बैकस्लैश का उपयोग रेगेक्स इंजन (\\[ -> \[)
में अनचेक करने के लिए किया जाता है

हां यह काम करता है, लेकिन एक अच्छा अभ्यास नहीं है।

2

नियमित अभिव्यक्ति केवल /(?:\\[trn])+/ है। लेकिन जब से तुम रूप में अच्छी तरह स्ट्रिंग घोषणाओं के बैकस्लैश से बचने के लिए की जरूरत है, प्रत्येक बैकस्लैश \\ साथ व्यक्त किया जाना चाहिए:

"/(?:\\\\[trn])+/" 
'/(?:\\\\[trn])+/' 

बस तीन backspaces इसलिए भी कि पीएचपी एस्केप अनुक्रम \[ पता नहीं है और यह ध्यान नहीं देता है काम करते हैं। तो \\\ बन जाएगा लेकिन \[\[ रहेगा।

+0

फिर 3 बैकस्लेश क्यों काम करते हैं? और इस मामले में दोहरे उद्धरणों से एकल उद्धरण अलग क्यों नहीं हैं? –

+0

@kemp: मेरा उत्तर अपडेट किया गया। – Gumbo

+0

गम्बो :: बस मुझे पता है कि मैं सही ढंग से समझ गया हूं - यह मामला काम करता है क्योंकि \ \ 'नियंत्रण कक्ष नहीं है ** और ** यह एक शाब्दिक ओपन स्क्वायर ब्रैकेट नहीं बनता है क्योंकि पैटर्न को बाएं से दाएं पार्स किया गया है तो बैकस्लैश इसके पहले से जुड़ा हुआ है और पहले से बच निकला है? –

8

पर्ल में इसका काम करता है क्योंकि आप पारित कि सीधे regex पैटर्न के रूप में /(?:\\[trn])+/

लेकिन php में, आप स्ट्रिंग के रूप में पारित करने के लिए की जरूरत है, तो बैकस्लैश खुद के लिए भागने अतिरिक्त जरूरत है।

"/(?:\\\\[trn])+/" 

regex \ मैच के लिए एक एकल बैकस्लैश एक PHP preg string

-2

उपयोग str_replace 'के रूप में/\\\\ /' बन जाएगा! तो आप केवल दो बैकस्लैश जरूरत

$code = str_replace(array("\t","\n","\r"),'',$code); 

, चाल

+1

यह मेरे प्रश्न का उत्तर नहीं देता है, और यह भी गलत है क्योंकि str_replace() एक ही उद्धरण के साथ सभी अनुरोधित वर्णों (हालांकि वे हैं) के प्रतिस्थापन की अनुमति नहीं देता है - आप उन्हें केवल हटा सकते हैं। –

+0

@kemp हाँ यह करता है। यदि यह हटा नहीं जाता है क्योंकि यह \ r \ n या \ n \ r – AntonioCS

+1

नहीं है, तो आप एक सिंगल व्हाइटस्पेस वाले लोगों के कहने वाले तीन (या किसी भी मनमानी संख्या) को प्रतिस्थापित नहीं कर सकते हैं, जब तक कि आप नहीं चाहते ** ** ** हर संभव संयोजन प्रदान करें। आपका कोड क्या करता है बस उन्हें हटा रहा है। –