2010-10-20 5 views
7

पीएचपी एक चर चर का उपयोग कर सकते हैं ...PHP में एक चर नाम के रूप में एक स्ट्रिंग का उपयोग कैसे किया जा सकता है यह जांचने के लिए कैसे?

उदाहरण के लिए ...

class obj { } 
$fieldName = "Surname"; 
$object = new obj(); 
$object->Name = "John"; 
$object->$fieldName = "Doe"; 
echo "{$object->Name} {$object->Surname}"; // This echoes "John Doe". 

हालांकि, $ FIELDNAME स्ट्रिंग कुछ अक्षर चर नाम में अनुमति नहीं हो सकती है। PHP अभी भी उस नाम के साथ फ़ील्ड बना देगा (एसोसिएटिव सरणी की तरह), लेकिन मैं इसे ऑब्जेक्ट -> ...... के साथ एक्सेस नहीं कर पाऊंगा क्योंकि यह सही ढंग से पार्स नहीं करेगा।

अब, क्या कोई ऐसा फ़ंक्शन है जो जांच सकता है कि स्ट्रिंग को वैध PHP चर नाम के रूप में उपयोग किया जा सकता है या नहीं। यदि नहीं, तो नियमित अभिव्यक्तियों का उपयोग करके यह कैसे बनाया जाएगा? PHP में चर नामों के नियम क्या हैं?

+1

जबकि आप निश्चित रूप से ऐसा कर सकते हैं, तो यह संभवतः चर के साथ इस दृष्टिकोण को लेने के लिए एक खराब डिज़ाइन है। – Fosco

+0

* (संबंधित) * [विधियों, स्थिरांक, चर और फ़ील्ड के लिए विदेशी नाम] (http://stackoverflow.com/questions/3417180/exotic-names-for-methods-constants-variables-and-fields-bug-or -फेचर "चर्चा करता है कि क्यों PHP वैरिएबल नामों के लिए $ ☂ = 1 या $ {''} = 1 की अनुमति देता है") – Gordon

उत्तर

15

the manual से::

चर नाम PHP में अन्य लेबल के रूप में ही नियमों का पालन

इस regex पर दस्तावेज़ से सीधे है। वैध वैरिएबल नाम किसी अक्षर या अंडरस्कोर से शुरू होता है, उसके बाद अक्षरों, संख्याओं या अंडरस्कोर की संख्या होती है। एक नियमित अभिव्यक्ति के रूप में, यह इस प्रकार व्यक्त किया जाएगा: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'

तो अगर आप रेगुलर एक्सप्रेशन से के माध्यम से अपने स्ट्रिंग भाग गया, आप अगर यह वैध है या नहीं है यह बताने के लिए सक्षम होना चाहिए।

यह ध्यान दिया जाना चाहिए कि एक चर चर के उपयोग से 'अमान्य' ऑब्जेक्ट प्रॉपर्टी नामों तक पहुंचने की क्षमता कुछ एक्सएमएल पार्सिंग के लिए सही दृष्टिकोण है।

उदाहरण के लिए, SimpleXML डॉक्स से:

एक XML दस्तावेज है कि PHP के नामकरण परंपरा के तहत अनुमत नहीं (जैसे हाइफन) वर्ण होने के भीतर तत्वों को एक्सेस करना ब्रेसिज़ और भीतर तत्व नाम encapsulating द्वारा पूरा किया जा सकता apostrophe।

इस कोड उदाहरण इसके बाद:

echo $xml->movie->{'great-lines'}->line; 

तो यह जरूरी गलत गुण है कि केवल इस तरह से पहुँचा जा सकता है के लिए नहीं है।

हालांकि, यदि आपका कोड ऑब्जेक्ट बनाता है और इसका उपयोग करता है - तो कोई आश्चर्य करेगा कि आप उन प्रकार की संपत्तियों का उपयोग क्यों करेंगे। बेशक, SimpleXML उदाहरण के समान स्थिति, जहां आपके ऑब्जेक्ट के दायरे से बाहर कुछ प्रस्तुत करने के लिए कोई ऑब्जेक्ट बनाया गया है।

+0

echo preg_match ('/ [a-zA-Z_ \ x7f- \ xff] [a-zA- Z0-9_ \ x7f- \ xff] */', ".1master"); प्रिंट 1? यह डॉट को कैसे स्वीकार करता है? –

+0

@kornelijepetak क्योंकि 'preg_match' एक मैच की तलाश में है, यह पूरी स्ट्रिंग को मान्य नहीं कर रहा है। मिलान को पूरी स्ट्रिंग होने के लिए मजबूर करने के लिए '/^[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] * $ /' का उपयोग करें। –

+0

मुझे समझ में नहीं आता क्यों \ x7f- \ xff का उपयोग यहां किया जाता है? क्या कोई इसे समझा सकता है? –

-1

मुझे लगता है कि regex जाने का रास्ता है, और जहाँ तक मैं याद कर सकते हैं प्रतिबंध नहीं हैं:

  • अक्षरांकीय
  • एक पत्र
  • से प्रारंभ होना चाहिए एक अंडरस्कोर
शामिल कर सकते हैं

तो रेगेक्स "/ [ए-जेए-जेड] + [0-9 ए-जेए-जेड _] * /" - मेरे सिर के ऊपर से होगा ताकि आपका मिलेज अलग-अलग हो।

1

हालांकि, `$ fieldName स्ट्रिंग में वेरिएबल नामों में कुछ वर्णों की अनुमति नहीं हो सकती है। PHP अभी भी उस नाम के साथ फ़ील्ड बना देगा (एसोसिएटिव सरणी की तरह), लेकिन मैं इसे ऑब्जेक्ट -> ...... के साथ एक्सेस नहीं कर पाऊंगा क्योंकि यह सही ढंग से पार्स नहीं करेगा।

आप अभी भी $object->{"fieldname"} वाक्यविन्यास के माध्यम से फ़ील्ड तक पहुंच पाएंगे।

जहां तक ​​मुझे पता है, केवल प्रतिबंध यह है कि आप नाम में \x00 के साथ गुणों तक नहीं पहुंच सकते हैं और आप \x00 से शुरू होने वाले चर को परिभाषित नहीं कर सकते हैं।

उदाहरण:

$a = new stdclass; 
$a->{"\x00dd"} = 8; //invalid 
$a->{"dd\x00dd"} = 8; //valid, but... 
echo $a->{"dd\x00dd"}; //can't read (no property "dd") 
+0

मजेदार। यह कोड वास्तव में PHP 4 में काम करता है। – webbiedave

+0

@web शायद ऐसा इसलिए है क्योंकि निजी गुणों को लागू करने के लिए शून्य वर्णों का उपयोग किया जाता है और उन्हें केवल PHP 5 में पेश किया गया था। – Artefacto

1

लेकिन मैं $ वस्तु के साथ यह उपयोग करने में सक्षम नहीं होगा -> ...... क्योंकि यह सही ढंग से पार्स नहीं होता

लेकिन देखें:

class A {} 

$varName = '!asd asd'; 
$a = new A(); 
$a->$varName = '1'; 
echo "{$a->{'!asd asd'}}"; // 1 

निश्चित रूप से अनुशंसित नहीं है लेकिन यह किया जा सकता है।

5

यह पहले से ही उत्तर दिया था, लेकिन नहीं कोड की एक पूरी लाइन के साथ:

if (preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/','evaluation string')) 
{ 
    // the string is valid 
} 
else 
{ 
    // the string is not valid 
} 
0

RegEx के साथ सत्यापित किया जा रहा है, तो आप $ या &$ (संदर्भ द्वारा चर पारित) स्ट्रिंग में मान्य करने की अनुमति देने के लिए चाहता था, आप इस रेगेक्स का उपयोग कर सकते हैं:

/^([\$]|(&\$))[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/ 
संबंधित मुद्दे

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