रेगेक्स में एक स्थान का मिलान


229

मुझे एक PHP नियमित अभिव्यक्ति में एक अंतरिक्ष चरित्र से मेल खाना चाहिए। किसी को कोई विचार मिला?

मेरा मतलब है "गेविन स्कुलज़", दो शब्दों के बीच की जगह। मैं यह सुनिश्चित करने के लिए एक नियमित अभिव्यक्ति का उपयोग कर रहा हूं कि मैं केवल पत्र, संख्या और एक स्थान की अनुमति देता हूं। लेकिन मुझे यकीन नहीं है कि अंतरिक्ष कैसे मिलेगा। मेरे पास अभी यही है:

$newtag = preg_replace("/[^a-zA-Z0-9s|]/", "", $tag);

2
हम्म ... कोई 'a' या 'b' ...;) मिलान करने के बारे में भी कोई सवाल नहीं है?)

जवाबों:


368

यदि आप एक स्थान की तलाश कर रहे हैं, तो वह " "(एक स्थान) होगा।

यदि आप एक या अधिक की तलाश में हैं, तो यह " *"( दो स्थान और तारांकन) या " +"(एक स्थान और एक प्लस) है।

आप आम रिक्ति, उपयोग के लिए देख रहे हैं "[ X]"या "[ X][ X]*"या "[ X]+"जहांX शारीरिक टैब वर्ण है (और प्रत्येक उन सभी उदाहरण में एक भी अंतरिक्ष से पहले किया जाता है)।

ये मेरे द्वारा देखे गए प्रत्येक * रेगेक्स इंजन में काम करेंगे (जिनमें से कुछ में एक या अधिक "+"वर्ण नहीं हैं, उह)।

यदि आप जानते हैं कि आप आधुनिक रेगेक्स इंजनों में से एक का उपयोग कर "\s"रहे हैं , और इसकी विविधताएँ जाने का मार्ग हैं। इसके अलावा, मेरा मानना ​​है कि शब्द सीमाएँ रेखाओं के शुरू होने और समाप्त होने के साथ-साथ महत्वपूर्ण होती हैं, जब आप उन शब्दों की तलाश में होते हैं जो पूर्ववर्ती या रिक्त स्थान के बिना दिखाई दे सकते हैं।

PHP के लिए विशेष रूप से, यह पृष्ठ मदद कर सकता है।

अपने संपादन से, ऐसा प्रतीत होता है कि आप सभी गैर-मान्य वर्णों को हटाना चाहते हैं। इस की शुरुआत है (नोट रेगेक्स के अंदर का स्थान)

$newtag = preg_replace ("/[^a-zA-Z0-9 ]/", "", $tag);
#                                    ^ space here

अगर आप यह भी सुनिश्चित करना चाहते हैं कि प्रत्येक शब्द के बीच केवल एक ही स्थान हो और शुरुआत या अंत में कोई नहीं हो, तो यह थोड़ा अधिक जटिल है (और शायद एक और सवाल) लेकिन मूल विचार यह होगा:

$newtag = preg_replace ("/ +/", " ", $tag); # convert all multispaces to space
$newtag = preg_replace ("/^ /", "", $tag);  # remove space from start
$newtag = preg_replace ("/ $/", "", $tag);  # and end

उनका मूल रेगेक्स "" चरित्र को बदलना चाहता था। आप अंतरिक्ष की उपेक्षा कर रहे हैं, इसलिए उसका स्थान इरादा के अनुसार "हटा दिया" नहीं जाएगा।
सुरूर 1

उद्धरण: "केवल पत्र, संख्या और एक स्थान की अनुमति दें", गैविन की मूल आरई गलत थी (यही कारण है कि वह सवाल पूछ रहा था)। मेरा आरई उन सभी को हटा देता है जो उनमें से एक नहीं है।
पैक्सिडाब्लो

मैच के पैटर्न के स्थान पर स्पेस क्यों होना चाहिए, इसके बजाय, बीच में बोलें?
वॉरेन

1
@warren, यह नहीं है। 'स्पेस यहाँ' टिप्पणी यह ​​नहीं बता रही थी कि अंतरिक्ष कहाँ गया था, बल्कि यह बता रहा था कि वहाँ एक स्पेस था (यदि पाठक को पता चल गया था)।
paxdiablo

@ माय, नहीं, ऐसी बात नहीं है। यहां आशय उन सभी पात्रों को बदलना है जो सेट में नहीं हैं A-Za-z...। वर्गाकार कोष्ठकों के अंदर का कैरेट यह तय करता है। वर्ग कोष्ठक के बाहर कैरेट को ले जाने से स्ट्रिंग के शुरू में सेट में मिलान वाले वर्णों में इसका अर्थ बदल जाता है ।
paxdiablo


34

यहां उन सभी चीजों के बारे में बताया गया है, जिन्हें आप नियमित अभिव्यक्ति के बारे में जानते हैं:

  • [[:blank:]] केवल स्थान या टैब
  • [[:space:]] श्वेत रिक्ति
  • \s कोई भी व्हाट्सएप चरित्र
  • \v ऊर्ध्वाधर व्हाट्सएप
  • \h क्षैतिज व्हाट्सएप
  • x व्हाट्सएप पर ध्यान न दें

5

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


5

पर्ल में स्विच \s(व्हाट्सएप) है।


16
यह गलत है - यह सभी व्हाट्सएप को इकट्ठा करता है, न कि केवल अंतरिक्ष चरित्र को।
जे टेलर

लेकिन सवाल PHP के साथ टैग किया गया है, पर्ल नहीं।
पीटर मोर्टेंसन

4

मैं यह सुनिश्चित करने के लिए एक रेगीक्स का उपयोग कर रहा हूं कि मैं केवल अक्षरों, संख्या और एक स्थान की अनुमति देता हूं

फिर यह उतना ही सरल है जितना कि आपके पास पहले से मौजूद एक स्थान को जोड़ना:

$newtag = preg_replace("/[^a-zA-Z0-9 ]/", "", $tag);

(ध्यान दें, मैंने s|जो अनजाने में लग रहा था हटा दिया s; निश्चित रूप से बेमानी था; आप को पुनर्स्थापित कर सकते हैं| इसे ज़रूरत पड़ने पर )

यदि आप विशेष रूप से * एक * स्थान चाहते हैं, तो केवल एक ही के रूप में , आपको इससे अधिक जटिल अभिव्यक्ति की आवश्यकता होगी, और तर्क के एक अलग गैर-रेगेक्स टुकड़े पर विचार करना चाह सकते हैं।


3

आप शब्द सीमा के लिए \ b का उपयोग भी कर सकते हैं। नाम के लिए मैं कुछ इस तरह का उपयोग करेगा:

[^\b]+\b[^\b]+(\b|$)

EDIT इसे पर्ल उदाहरण में एक रेगीक्स संशोधित करता है

if( $fullname =~ /([^\b]+)\b[^\b]+([^\b]+)(\b|$)/ ) {
 $first_name = $1;
 $last_name = $2;
}

संपादित करें कि आप क्या चाहते हैं के आधार पर:

$new_tag = preg_replace("/[\s\t]/","",$tag);

1

मैं एक उदाहरण में [[: space:]] की कोशिश कर रहा हूं जहां ऐसा लगता है कि वर्डप्रेस में ब्लॉगर गैर-मानक अंतरिक्ष वर्णों का उपयोग कर रहे हैं। ऐसा लग रहा है कि यह काम करेगा।


1

सिंगल स्पेस के लिए अनुमति देने के लिए इसे इस तरह उपयोग करें।

$newtag = preg_replace("/[^a-zA-Z0-9\s]/", "", $tag)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.