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


349

मुझे एक स्ट्रिंग से सभी वर्णों को निकालने की आवश्यकता है जो a-z A-Z 0-9सेट में नहीं हैं या रिक्त स्थान नहीं हैं।

किसी को भी यह करने के लिए एक समारोह है?

जवाबों:


695

लगता है जैसे आप लगभग जानते थे कि आप पहले से ही क्या करना चाहते थे, आपने मूल रूप से इसे एक रेक्स के रूप में परिभाषित किया।

preg_replace("/[^A-Za-z0-9 ]/", '', $string);

8
zuk1: regexbuddy साथ कि एक बहुत मदद है
relipse

2
यहाँ एक उदाहरण है यदि आप हाइफ़न को एक स्वीकृत चरित्र के रूप में शामिल करना चाहते हैं। मुझे इसकी आवश्यकता थी क्योंकि मुझे ईमेल पते के आधार पर एक मडल उपयोगकर्ता नाम से अस्वीकृत वर्णों को हटाने की आवश्यकता थी: preg_replace ("/ [^ ^ a-z0-9 _। @ \ -] /", '', $ string);
इवान डोनोवन

2
क्या यह उद्धरण चिह्न (डबल-कोट्स) के बजाय नियमित अभिव्यक्ति के आसपास एपोस्ट्रोफिस (एकल-उद्धरण) के साथ बिल्कुल वैसा ही काम करेगा? जैसे:preg_replace('/[^A-Za-z0-9 ]/', '', $string);
२५४०६२५

3
हम इस बारे में स्पष्टीकरण चाहते हैं :)। लोग यह देखने के लिए यहां आते हैं कि यह ऐसा क्यों है। कृपया रेगेक्स स्पष्टीकरण पर भी विचार करें! धन्यवाद
प्रतीक

1
क्या होगा अगर हम उच्चारण पात्रों को रखना चाहते हैं?
विनज़बक

169

यूनिकोड वर्णों के लिए, यह है:

preg_replace("/[^[:alnum:][:space:]]/u", '', $string);

हाय आवाजो, क्या / ui बात के साथ है .. आप इसे क्या कहते हैं? क्या कोई मुझे कुछ प्रकाश डाल सकता है धन्यवाद।
केबंग

4
स्पष्टीकरण के लिए, उन्हें झंडे कहा जाता है। वे समापन परिसीमन के बाद डालते हैं (इस मामले में यह "/" है, लेकिन यह "~" या "@" हो सकता है या जो भी चरित्र आप खोलने और बंद करने वाले सीमांकक के रूप में लंबे समय तक उपयोग करना चाहते हैं) और बदल सकते हैं अभिव्यक्ति का व्यवहार।
डॉकटोर जे

1
Btw, \wशामिल है \dऔर इसलिए \dअनावश्यक है। इसके अलावा, यह गलत है क्योंकि यह परिणामी स्ट्रिंग (जिसमें यह भी शामिल है \w) में अंडरस्कोर को छोड़ देगा ।
स्माइली

2
इसमें अभी भी एक त्रुटि है, चरित्र वर्गों को ':' 'के साथ समाप्त करने की आवश्यकता है: इसलिए सही लाइन होगी: प्रीग_रेप्ले ("/ [^ [[: अलनम:] [: space:]] / ui",' ' स्ट्रिंग $);
14

4
क्या iझंडा वास्तव में आवश्यक है क्योंकि [:alnum:]पहले से ही दोनों मामलों को शामिल किया गया है?
बिलिन्हा

50

नियमित अभिव्यक्ति आपका जवाब है।

$str = preg_replace('/[^a-z\d ]/i', '', $str);
  • iकेस संवेदी लिए खड़ा है।
  • ^ का मतलब है, के साथ शुरू नहीं करता है।
  • \d किसी भी अंक से मेल खाता है।
  • a-zaऔर के बीच सभी पात्रों से मेल खाता है z। की वजह से iपैरामीटर आपको यह निर्दिष्ट करने की जरूरत नहीं है a-zऔर A-Z
  • \dएक जगह होने के बाद , इस रेगेक्स में रिक्त स्थान की अनुमति है।

3
हम इस बारे में स्पष्टीकरण चाहते हैं :)। लोग यह देखने के लिए यहां आते हैं कि यह ऐसा क्यों है। कृपया रेगेक्स स्पष्टीकरण पर भी विचार करें! हर कोई यह जानने के लिए पर्याप्त उन्नत नहीं है कि आपने बिना स्पष्टीकरण के वहां क्या लिखा है। धन्यवाद
प्रतीक

@PratikCJoshi मैं मामले के प्रति असंवेदनशील है। ^ का अर्थ है, से शुरू नहीं होता है। \ d किसी भी अंक से मेल खाता है। az और z के बीच के सभी अक्षर az से मेल खाते हैं। I पैरामीटर के कारण आपको az और AZ को निर्दिष्ट करने की आवश्यकता नहीं है। \ D के बाद एक स्थान है, इसलिए इस regex में रिक्त स्थान की अनुमति है।
बार्ट

1
लोग उत्तर के रूप में टिप्पणियों को नहीं पढ़ते हैं। कृपया जवाब अपडेट करें!
प्रतिक

18

यहाँ उस के लिए एक बहुत ही सरल रेगीक्स है:

\W|_

और इसका उपयोग तब किया जाता है जब आपको इसकी आवश्यकता होती है (आगे /स्लैश सीमांकक के साथ)।

preg_replace("/\W|_/", '', $string);

इस महान उपकरण के साथ इसका परीक्षण करें जो बताता है कि रेगेक्स क्या कर रहा है:

http://www.regexr.com/


1
आपको अभी भी /uध्वज की आवश्यकता है अन्यथा गैर-एससीआई पत्र भी हटा दिए जाते हैं।
Xeoncross 19

नीट लेकिन रिक्त स्थान से मेल खाएगा और अगर यह चाहता है, तो संभवतः एक चरित्र वर्ग और एक या एक से अधिक के लिए अतिरिक्त क्वांटिफायर के उपयोग से प्रदर्शन को दोगुना कर सकता है [\W_]+
बबल

18

यदि आपको विशिष्ट AZ के बजाय अन्य भाषाओं का समर्थन करने की आवश्यकता है, तो आप निम्नलिखित का उपयोग कर सकते हैं:

preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
  • [^\p{L}\p{N} ]एक उपेक्षित को परिभाषित करता है (यह उस चरित्र से मेल खाएगा जो परिभाषित नहीं है):
    • \p{L}: किसी भी भाषा का एक पत्र ।
    • \p{N}: किसी भी स्क्रिप्ट में एक संख्यात्मक चरित्र ।
    • : एक अंतरिक्ष पात्र।
  • + लालच में चरित्र वर्ग 1 और असीमित समय के बीच मेल खाता है ।

यह अन्य भाषाओं और लिपियों के साथ-साथ AZ से अक्षरों और संख्याओं को संरक्षित करेगा:

preg_replace('/[^\p{L}\p{N} ]+/', '', 'hello-world'); // helloworld
preg_replace('/[^\p{L}\p{N} ]+/', '', 'abc@~#123-+=öäå'); // abc123öäå
preg_replace('/[^\p{L}\p{N} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界

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


8
[\W_]+

 

$string = preg_replace("/[\W_]+/u", '', $string);

यह सभी AZ, az, 0-9 का चयन करें और इसे हटा दें।

यहां देखें उदाहरण: https://regexr.com/3h1rj


1
इस regex / [\ W _] + / u का क्या अर्थ है?
38ngelo Rigo

\W\wजिसका विलोम अक्षर है A-Za-z0-9_। तो \Wकिसी भी चरित्र से मेल खाएगा जो कि नहीं है A-Za-z0-9_और उन्हें हटा दें। []एक है वर्ण सेट सीमा+एक वर्ण सेट सीमा पर अनावश्यक है लेकिन आम तौर पर 1 या अधिक चरित्र का मतलब है। uझंडा अभिव्यक्ति का विस्तार यूनिकोड चरित्र समर्थन शामिल करने के लिए, यह इस तरह के रूप में चरित्र कोड 255 परे पात्रों को नहीं निकाला जाएगा, जिसका अर्थ है ª²³µ। यूनिकोड और एससीआई पात्रों के साथ विभिन्न usages 3v4l.org/hSVV5 का उदाहरण ।
fyrye


0

मैं भी उत्तर की तलाश में था और मेरा इरादा हर गैर-अल्फा को साफ करने का था और एक से अधिक स्थान नहीं होने चाहिए।
तो, मैंने इस पर एलेक्स के उत्तर को संशोधित किया, और यह मेरे लिए काम कर रहा है preg_replace('/[^a-z|\s+]+/i', ' ', $name)
। ऊपर रेगेक्स स्पष्टीकरण में बदल sy8ed sirajul7_islamगया sy ed sirajul islam
: रेगेक्स मामले में असंवेदनशील तरीके से या एक से अधिक श्वेत रिक्त स्थान पर किसी भी व्यक्ति को जेड से चेक नहीं करेगा , और इसे एक एकल में बदल दिया जाएगा। अंतरिक्ष।


-2

आप स्ट्रिंग को वर्णों में विभाजित कर सकते हैं और इसे फ़िल्टर कर सकते हैं।

<?php 

function filter_alphanum($string) {
    $characters = str_split($string);
    $alphaNumeric = array_filter($characters,"ctype_alnum");
    return join($alphaNumeric);
}

$res = filter_alphanum("a!bc!#123");
print_r($res); // abc123

?>

डाउनवोट का कारण: 3v4l.org/fqLVZ इसके अलावा अज्ञात लंबाई के एक तार पर कॉलिंग (3 + एन) फ़ंक्शन एक एकल और सरल preg_replace()कॉल की तुलना में वास्तव में अनाकर्षक लगता है ।
मिकमैकुसा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.