2013-05-07 2 views
12

मैं PHP का उपयोग करता हूं।PHP नियमित अभिव्यक्ति - सभी गैर-अल्फान्यूमेरिक वर्णों को हटाएं

मेरे स्ट्रिंग इस

This is a string-test width åäö and some über+strange characters: _like this?

प्रश्न

वहाँ गैर अक्षरांकीय अक्षर को हटाने और उन्हें एक स्थान के साथ बदलने के लिए एक रास्ता है की तरह लग रहे कर सकते हैं?

  • +
  • -

    • :
    • _
    • यहाँ कुछ गैर अक्षरांकीय अक्षर हैं?

    मैं इसके बारे में कई सूत्र पढ़ा है, लेकिन वे इस तरह से एक है, अन्य भाषाओं का समर्थन नहीं करते:

    • कोई भी पत्र पात्रों में से मेरी सूची

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

      आवश्यकताओं हो सकता है पूरा नहीं हो

    • मेरी सामग्री में विभिन्न भाषाओं में वर्ण हैं, जैसे åäöü। बहुत अधिक हो सकता है।
    • गैर-अल्फान्यूमेरिक वर्णों को एक स्थान के साथ प्रतिस्थापित किया जाना चाहिए। अन्यथा शब्द एक दूसरे के लिए चिपकाया जाएगा।
  • उत्तर

    27

    आप इस कोशिश कर सकते हैं:

    preg_replace('~[^\p{L}\p{N}]++~u', ' ', $string); 
    

    \p{L} सभी वर्णमाला वर्ण (जो कुछ भी वर्णमाला) के लिए खड़ा है।

    \p{N} संख्याओं के लिए खड़ा है।

    विषय स्ट्रिंग के यू संशोधक पात्रों के साथ यूनिकोड वर्णों के रूप में माना जाता है।

    या इस:

    preg_replace('~\P{Xan}++~u', ' ', $string); 
    

    \p{Xan} यूनिकोड अक्षर और अंक शामिल हैं।

    \P{Xan} में वे सभी शामिल हैं जो यूनिकोड अक्षरों और अंकों नहीं हैं। (सावधान रहो, यह है कि आप ~[^\p{Xan}\s]++~u साथ रक्षा कर सकते हैं भी सफेद रिक्त स्थान शामिल हैं)

    आप अनुमति पत्र की अधिक विशिष्ट समूह को आप unicode table में सीमाओं के साथ \p{L} बदलना होगा चाहते हैं।

    उदाहरण:

    preg_replace('~[^a-zÀ-ÖØ-öÿŸ\d]++~ui', ' ', $string); 
    

    क्यों एक स्वत्वबोधक परिमाणक (++) यहाँ का उपयोग कर?

    ~\P{Xan}+~u आपको ~\P{Xan}++~u के समान परिणाम देगा। यहां अंतर यह है कि पहले इंजन में प्रत्येक बैकट्रैकिंग स्थिति (जिसे हमें आवश्यकता नहीं है) रिकॉर्ड करता है जब दूसरे में यह नहीं होता है (जैसे परमाणु समूह में)। परिणाम एक छोटा प्रदर्शन लाभ है।

    मुझे लगता है कि यह संभव होने पर स्वामित्व वाले क्वांटिफायर और परमाणु समूहों का उपयोग करना एक अच्छा अभ्यास है।

    हालांकि, PCRE regex इंजन स्वचालित रूप से एक परिमाणक स्पष्ट स्थितियों में अधिकार बनाता है (उदाहरण: a+b =>a++b) को छोड़कर PCRE मॉड्यूल विकल्प PCRE_NO_AUTO_POSSESS साथ संकलित किया गया है, तो।(http://www.pcre.org/pcre.txt)

    अधिक अधिकार परिमाणकों और परमाणु समूहों here (possessive quantifiers) और here (atomic groups) या here

    +0

    इस। हालांकि, स्ट्रिंग पर निर्भर करते हुए, कोई भी '\ X' शामिल करना चाह सकता है। – Wrikken

    +0

    पहला व्यक्ति अपेक्षित के रूप में काम करता था। इसके लिए वोट दें। –

    +0

    ++ ~ आप क्या करते हैं? –

    1

    मुझे पूरी तरह से यकीन नहीं है कि आप किस प्रकार के रेगेक्स का उपयोग कर रहे हैं। हालांकि, POSIX regexes आपको वर्णमाला वर्ग व्यक्त करने की अनुमति देता है, जहां [: अल्फा:] किसी भी वर्णमाला वर्ण का प्रतिनिधित्व करता है।

    तो कोशिश:

    preg_replace("/[^[:alpha:]0-9 ]/", '', $string); 
    

    वास्तव में, मैं के बारे में भूल [: alnum:] -:

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

    आप शायद \W के लिए देख रहे हैं कि यह आसान बनाता है?

    कुछ की तरह:

    /[\W_]*/ 
    

    से मेल खाता है सभी गैर अक्षरांकीय चरित्र और रेखांकित।

    \w मैचों सभी शब्द चरित्र (वर्णमाला, संख्यात्मक, रेखांकित)

    \W\w में नहीं कुछ भी मेल खाता है।

    तो, \W किसी भी गैर-अल्फान्यूमेरिक वर्णों से मेल खाता है और आप अंडरस्कोर जोड़ते हैं क्योंकि \W अंडरस्कोर से मेल नहीं खाता है।

    संपादित करें:

    preg_replace("/[\W_]*/", ' ', $string); 
    

    ' ' मतलब है कि सभी मिलान करने वाले वर्णों (उन नहीं पत्र और नहीं संख्या) सफेद रिक्त स्थान बन जाएगा: इस कोड के अपने लाइन बन सकते हैं।

    reedit: आप इसके अतिरिक्त, एक और preg_replace उपयोग करने के लिए सभी लगातार रिक्त स्थान को हटा दें और उन्हें एक ही स्थान के साथ बदलने के लिए चाहते हो सकता है अन्यथा आप के साथ खत्म करेंगे: आप उपयोग कर सकते हैं

    This is a string test width  and some ber strange characters like this 
    

    :

    preg_replace("/\s+/", ' ', $string); 
    

    और अंत में शुरुआत और अंत स्थान को ट्रिम करें।

    1

    \p{xx} के बारे में जानकारियां, see here

    तो आप के लिए, मेरा मानना ​​है कि क्या देख रहे है, की कोशिश:

    preg_replace("/\P{L}+/u", ' ', $string); 
    
    +0

    लेकिन क्या यह उन सभी वर्णमाला वर्णों को प्रतिस्थापित नहीं करता है जिन्हें ओपी अंतरिक्ष के रूप में छोड़ना चाहता है? – Jerry

    +0

    यह किसी भी वर्णमाला वर्णों को प्रतिस्थापित नहीं करना चाहिए, नहीं (अपरकेस पी नोट करें)। – femtoRgon

    +0

    ओह, ठीक है। लेकिन फिर, संख्यात्मक पात्रों के बारे में क्या? क्या वे 'एल' में शामिल हैं? मुझे यकीन नहीं है कि प्रलेखन का मतलब 'संशोधक पत्र' या 'अन्य अक्षर' से क्या है। – Jerry

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