2010-07-20 14 views
5

मुझे मूल रूप से एक फ़ंक्शन की आवश्यकता है यह जांचने के लिए कि स्ट्रिंग के वर्ण (प्रत्येक वर्ण) सरणी में हैं या नहीं।यह जांचने के लिए कि कोई स्ट्रिंग किसी सरणी में है या नहीं?

मेरे कोड अब तक काम नहीं कर रहा है, लेकिन यहां यह वैसे भी है,

$allowedChars = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"," ","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","0","1","2","3","4","5","6","7","8","9"," ","@",".","-","_","+"," "); 

$input = "Test"; 
$input = str_split($input); 

if (in_array($input,$allowedChars)) {echo "Yep, found.";}else {echo "Sigh, not found...";} 

मैं यह कहना चाहता हूँ 'हां, मिल गया।' यदि $ इनपुट में अक्षरों में से एक $allowedChars में पाया जाता है। काफी सरल, सही? खैर, यह काम नहीं करता है, और मुझे कोई फ़ंक्शन नहीं मिला है जो किसी स्ट्रिंग के व्यक्तिगत वर्णों को किसी सरणी में मान के लिए खोजेगा।

वैसे, मैं इसे सिर्फ उन सरणी के मूल्यों होना चाहता हूँ, मैं कल्पना html_strip_entities के लिए नहीं देख रहा हूँ या जो कुछ भी यह है, मैं अनुमति वर्णों के लिए सटीक सरणी का उपयोग करना चाहते।

उत्तर

6

आप वास्तव में regex और preg_match समारोह में दिखना चाहिए: http://php.net/manual/en/function.preg-match.php

लेकिन, यह आपके विशेष अनुरोध काम करना चाहिए:

$allowedChars = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"," ","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","0","1","2","3","4","5","6","7","8","9"," ","@",".","-","_","+"," "); 
$input = "Test"; 
$input = str_split($input); 
$message = "Sigh, not found..."; 
foreach($input as $letter) { 
    if (in_array($letter, $allowedChars)) { 
     $message = "Yep, found."; 
     break; 
    } 
} 
echo $message; 
4

क्या आप नियमित अभिव्यक्तियों से परिचित हैं? यह ऐसा करने का अधिक स्वीकार्य तरीका है जिसे आप करने की कोशिश कर रहे हैं, जब तक कि मैं यहां कुछ याद नहीं कर रहा हूं।

() के पर एक नज़र डालें: http://php.net/manual/en/function.preg-match.php

अपने उदाहरण से निपटने के लिए यहां कुछ नमूना कोड (टिप्पणियाँ में मुद्दों का समाधान करने के लिए अद्यतन) है:

$subject = "Hello, this is a string"; 
$pattern = '/[a-zA-Z0-9 @._+-]*/'; // include all the symbols you want to match here 

if (preg_match($pattern, $subject)) 
    echo "Yep, matches"; 
else 
    echo "Doesn't match :("; 

regex की एक छोटी सी स्पष्टीकरण : '^' स्ट्रिंग की शुरुआत से मेल खाता है, '[a-zA-Z0 -9 @ ._ + -]' भाग का अर्थ है "इस सेट में कोई भी वर्ण", '*' इसका अर्थ है "शून्य या अधिक आखिरी चीज ", और अंत में '$' अंत में स्ट्रिंग के अंत से मेल खाता है।

+0

आह, धन्यवाद, लेकिन जब मैं चलने वाले यह कहते हैं कि - पहले अंडरस्कोर यह एक त्रुटि :(क्यों की जाती है कि नहीं, मैं के साथ रेगुलर एक्सप्रेशन से परिचित नहीं हूँ देता है:?, पी अच्छी तरह से मैं के बारे में सुना है लेकिन मैं इसे कुछ भी करने के लायक नहीं कर सकता: पी – Scott

+0

यह वह नहीं है जो वह चाहता है। "अगर $ इनपुट में अक्षरों में से एक अक्षर पाया जाता है"। इसे ठीक करने के लिए, '^' और '$' को हटाएं। – NawaMan

+0

हम्म, मैंने यह किया है लेकिन यह अभी भी मुझे यह त्रुटि देता है: चेतावनी: preg_match() [function.preg-match]: अज्ञात संशोधक '-' /home/jaxo/web/tests/test.php पर लाइन (preg_match कथन के साथ लाइन) – Scott

1

थोड़ा अलग ढंग:

$allowedChars = array("a","b","c","d","e"); 
$char_buff = explode('', "Test"); 
$foundTheseOnes = array_intersect($char_buff, $allowedChars); 
if(!empty($foundTheseOnes)) { 
    echo 'Yep, something was found. Let\'s find out what: <br />'; 
    print_r($foundTheseOnes); 
} 
0

क्योंकि आप बस एक स्ट्रिंग को मान्य कर रहे हैं, इसके बजाय preg_match() और अन्य पीसीआर फ़ंक्शंस को इसके लिए संभालने के लिए देखें।

वैकल्पिक रूप से, आप एक स्ट्रिंग में वर्णों सत्यापित किया जा रहा सबसे उचित रूप से स्ट्रिंग कार्यों के साथ किया जाता है strcspn() उपयोग कर सकते हैं करने के लिए ...

 

$check = "abcde.... '; // fill in the rest of the characters 
$test = "Test"; 
echo ((strcspn($test, $check) === strlen($test)) ? "Sigh, not found..." : 'Yep, found.'); 

1


preg_match() इस कार्य के लिए सबसे सीधी/सुरुचिपूर्ण विधि है।

कोड: (Demo)

$input="Test Test Test Test"; 
if(preg_match('/^[\w [email protected]_-]*$/',$input)){ 
    echo "Input string does not contain any disallowed characters"; 
}else{ 
    echo "Input contains one or more disallowed characters"; 
} 
// output: Yes, input contains only allowed characters 

पैटर्न स्पष्टीकरण:

/   # start pattern 
^   # start matching from start of string 
[\w [email protected]] # match: a-z, A-Z, 0-9, underscore, space, plus, dot, atsign, hyphen 
*   # zero or more occurrences 
$   # match until end of string 
/  # end pattern 

महत्वपूर्ण अंक:

  • ^ और $ एंकर सुनिश्चित करना है कि पूरी स्ट्रिंग मान्य है महत्वपूर्ण हैं स्ट्रिंग के सिर्फ एक सबस्ट्रिंग बनाम।[a-zA-Z0-9_]
  • .dot character अपने 'कुछ भी मेल खाते हैं (लगभग) "अर्थ खो देता है और शाब्दिक हो जाता है जब इसके अंदर लिखा है: -
  • \w (उर्फ" किसी भी शब्द चरित्र "> एक shorthand character class) आसान तरीका लिखना है एक चरित्र वर्ग। कोई भागने स्लैश आवश्यक है।
  • character class के अंदर हाइफ़न को एस्केपिंग स्लैश (\-) के बिना लिखा जा सकता है जब तक कि यह वर्ण वर्ग की शुरुआत या अंत में स्थित हो। यदि हाइफ़न प्रारंभ/अंत में नहीं है और यह बच नहीं गया है, तो यह इसके दोनों तरफ के पात्रों के बीच वर्णों की एक श्रृंखला बनाएगा।
    इसे पसंद है या नहीं, [.-z] एक हाइफ़न प्रतीक से मेल नहीं खाएगा क्योंकि यह ascii table पर डॉट कैरेक्टर और लोअरकेस अक्षर जेड के बीच "अस्तित्व" नहीं है।
  • * जो कि वर्ण वर्ग का पालन करता है "quantifier" है। तारांकन का मतलब पिछले चरित्र वर्ग के "0 या अधिक" है। इस मामले में, इसका मतलब है कि preg_match() खाली स्ट्रिंग की अनुमति देगा। यदि आप एक खाली स्ट्रिंग को अस्वीकार करना चाहते हैं, तो आप + का उपयोग कर सकते हैं जिसका अर्थ है कि पिछले वर्ण वर्ग का "1 या अधिक"। अंत में, आप एक घुंघराले ब्रैकेट अभिव्यक्ति में संख्या या संख्याओं का उपयोग करके स्ट्रिंग लम्बाई के बारे में कहीं अधिक विशिष्ट हो सकते हैं।
    • {8} का मतलब यह होगा कि स्ट्रिंग बिल्कुल 8 वर्ण लंबी होनी चाहिए।
    • {4,} का मतलब यह होगा कि स्ट्रिंग कम से कम 4 वर्ण लंबी होनी चाहिए।
    • {,10} मतलब स्ट्रिंग की लंबाई होना चाहिए 0 और 10
    • {5,9} के बीच का मतलब होगा स्ट्रिंग की लंबाई 5 और 9 वर्णों के बीच होना चाहिए होगा।

कि सलाह के सभी एक तरफ, अगर आप पूरी तरह से और वर्ण के अपने सरणी का उपयोग करना चाहिए और आप अपने सत्यापन सरणी के खिलाफ अलग-अलग पात्रों की जांच करने के एक पाश उपयोग करना चाहता था (मैं निश्चित रूप से सलाह नहीं देते यह), तो लक्ष्य कुल पुनरावृत्तियों को कम करने के लिए शामिल सरणी तत्वों की संख्या को कम करना चाहिए।

  • आपके $allowedChars सरणी में कई तत्व हैं जिनमें अंतरिक्ष चरित्र होता है, लेकिन केवल एक आवश्यक है। आपको array_unique() या इसी तरह की तकनीक का उपयोग करके सरणी तैयार करनी चाहिए।
  • str_split($input) डुप्लिकेट तत्वों के साथ एक सरणी उत्पन्न करने का मौका चलाएगा। उदाहरण के लिए, यदि $input="Test Test Test Test"; तो str_split() से परिणामस्वरूप सरणी में 1 9 तत्व होंगे, जिनमें से 14 को अनावश्यक सत्यापन जांच की आवश्यकता होगी।
  • आप शायद count_chars($input,3) बुला और str_split() को खिलाने कि द्वारा str_split() से अतिरिक्तताओं को समाप्त कर सकता या वैकल्पिक रूप से आप सतत प्रक्रिया प्रदर्शन से पहले str_split() तो array_unique() कह सकते हैं।
+0

यह एक अच्छा जवाब है, लेकिन मैंने 7 साल पहले इस सवाल से थोड़ा पूछा था! मुझे उम्मीद है कि यह भविष्य में किसी की मदद करता है, हालांकि। – Scott

+1

हाँ, यह सब मैं जा रहा था। चीयर्स। – mickmackusa

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

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