स्ट्रिंग से केवल अल्फा-न्यूमेरिक वर्ण वापस करने के लिए फ़ंक्शन?


98

मैं एक php फ़ंक्शन की तलाश कर रहा हूं जो एक इनपुट स्ट्रिंग लेगा और केवल अल्फा-न्यूमेरिक छोड़ने वाले सभी विशेष वर्णों को अलग करके इसका एक स्वच्छता संस्करण लौटाएगा।

मुझे एक दूसरे फंक्शन की ज़रूरत है जो वही करता है लेकिन केवल अक्षर अक्षर AZ ही देता है।

किसी भी मदद की बहुत सराहना की।


ये यूनिकोड नॉर्मलाइज़ेशन फॉर्म कौन से हैं और आप ऐसा क्यों करना चाहते हैं?
21 अप्रेल को tchrist

1
जब आप AZ और 'अल्फ़ान्यूमेरिक' कहते हैं, तो क्या आपका वास्तव में केवल AZ मतलब है या आप विदेशी भाषाओं और अप्रचलित लिपियों सहित सभी भाषाओं के सभी अक्षरों से मेल खाना चाहते हैं?
मार्क बायर्स

यदि आप ऐसा कर रहे हैं तो आप एक उच्चारण-असंवेदनशील स्ट्रिंग तुलना कर सकते हैं, तो आप गलत काम कर रहे हैं।
21

3
यह नहीं बस "सभी भाषाओं से"। यह अंग्रेजी है। अंग्रेजी लैटिन लिपि का उपयोग करता है। वहाँ unichars '\p{Latin}' '\p{Alphabetic}' '[^A-Za-z]' | wc -l== 1192 कोड बिंदु हैं जो लैटिन वर्णमाला हैं लेकिन जो AZ नहीं हैं। यह आमतौर पर मिथक है कि ASCII अंग्रेजी के लिए पर्याप्त है। यह नहीं है, और यही कारण है कि लेखन AZ को इसमें एक कोड गंध है।
tchrist

1
@ Scott B: अंग्रेजी केवल AZ से 26 अक्षरों का उपयोग नहीं करता है। उदाहरण के लिए रिज्यूम शब्द में é शामिल है। शायद आप समझा सकते हैं कि आप क्या करने की कोशिश कर रहे हैं क्योंकि इससे आपको बेहतर उत्तर प्राप्त करने में मदद मिल सकती है।
मार्क बायर्स

जवाबों:


212

चेतावनी: ध्यान दें कि अंग्रेजी केवल AZ तक ही सीमित नहीं है।

Az, AZ और 0-9 को छोड़कर सब कुछ निकालने के लिए इसे आज़माएं :

$result = preg_replace("/[^a-zA-Z0-9]+/", "", $s);

यदि अल्फ़ान्यूमेरिक की आपकी परिभाषा में विदेशी भाषाओं और अप्रचलित लिपियों के अक्षर शामिल हैं तो आपको यूनिकोड वर्ण वर्गों का उपयोग करना होगा।

केवल AZ छोड़ने के लिए यह प्रयास करें :

$result = preg_replace("/[^A-Z]+/", "", $s);

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


2
नहीं, अल्फ़ान्यूमेरिक है [\p{Alphabetic}\p{Numeric}]। मैं PCRE वर्णमाला गुण को भूल जाता हूं, लेकिन आप इसके साथ अनुमानित कर सकते हैं [\pL\pM\pN]
21

1
@ टिचर: मेरा मानना ​​है कि क्योंकि उसने विशेष रूप से AZ का उल्लेख किया है कि वह केवल उसी से मेल खाना चाहता है, हालांकि मैं स्वीकार करता हूं कि इस बिंदु पर प्रश्न बहुत अधिक स्पष्ट हो सकता है। मैं स्पष्टीकरण मांगूंगा।
मार्क बायर्स

1
@ मर्क, मैं आपके उत्तर के दूसरे भाग के साथ बहस नहीं कर रहा था, हालांकि अगर उसने पहले स्ट्रिंग को विघटित नहीं किया है, तो यह सही काम नहीं करेगा। मैं पहले भाग के साथ बहस कर रहा था। इसके अलावा, मैं हमेशा किसी भी डेटा पर काम करने वाले रीगेक्स को सही बनाने की कोशिश करता हूं , न कि केवल पुराने पुराने ASCII पर। :) इसलिए यह मंत्र कि मिलेनियम का यह पक्ष [A-Z]हमेशा गलत है, कभी-कभी
21

1
@ मर्क बायर्स, मैं देखता हूं .. और हां मैं पसंद करता iहूं लेकिन मुझे केवल अंग्रेजी जनसांख्यिकी के बारे में चिंता करना पड़ता है .. मैं भूल जाता हूं कि कई लोगों को अन्य भाषाओं के बारे में सोचना होगा। BTW मैंने अभी देखा कि आप उच्चतम प्रतिनिधि उपयोगकर्ता हैं जिन्होंने कभी 1 प्रश्न नहीं पूछा है। यहां तक ​​कि जॉन स्कीट ने पहले भी सवाल पूछे हैं!
जेडी इसाकेस

1
regexp के अंत में a + क्यों है? यदि आप इसे हटाते हैं तो यह नहीं होगा ... वही?
डेनिस

2

के बजाय preg_replace, आप हमेशा इस्तेमाल कर सकते हैं PHP के फिल्टर कार्यों का उपयोग कर filter_var()के साथ समारोह FILTER_SANITIZE_STRING


क्या PHP के पास ISO स्ट्रिंगपॉर्ग एल्गोरिदम है? मुझे पता है कि पर्ल और जावा करते हैं।
tchrist

मेरा मानना ​​है कि स्ट्रिंग फ़िल्टर फ़ंक्शन मुख्य रूप से 7-बिट ASCII के साथ काम करता है, लेकिन मुझे उस पर उद्धरण नहीं देते हैं।
मार्क बेकर

30
कृपया, क्या आप हमें यह बताने का एक स्पष्ट तरीका बता सकते हैं कि उपयोगकर्ता क्या उपयोग करने के लिए कह रहा है FILTER_SANITIZE_STRING? मेरी जानकारी के लिए, इस तरह से पास होने वाले निकटतम को साथ लिया जा सकता है FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH, लेकिन यह केवल अक्षरों और संख्याओं को नहीं छोड़ेगा, बल्कि डॉट्स, स्लैश, पर्केंट्स और वह सब भी होगा।
पेरे

$ iMycleanVar = filter_var ($ sStringWithNumbers, FILTER_SANITIZE_NUMBER -INT);
सुल्तानोस

4
यह उत्तर की बजाय टिप्पणी की तरह दिखता है। उत्तर लिखते समय उचित स्पष्टीकरण दें।
सिराज आलम

0
  1. सामान्य [ \ pL ] संख्याओं के लिए [ 0-9 ] और अक्षर
$string = preg_replace("/[^0-9\pL]+/", "", $string)
  1. विशेष रूप से अक्षर A से Z (केस-असंवेदनशील) [ a-zA-Z ] के लिए:
$string = preg_replace("/[^a-zA-Z]+/", "", $string)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.