2010-10-29 13 views
10

PHP नियमित अभिव्यक्ति स्क्रिप्ट किसी भी अक्षर को हटाने के लिए वर्णमाला पत्र या संख्या 0 से 9 नहीं है और स्थान को एक हाइफ़न में बदलता है - लोअरकेस में बदलें सुनिश्चित करें कि केवल एक हाइफ़न है - शब्दों के बीच कोई - या --- आदिनियमित अभिव्यक्ति - यूआरएल के अनुकूल कोई भी पाठ

उदाहरण के लिए:

उदाहरण:-जल्दी भूरे लोमड़ी-कूद

उदाहरण:: जल्दी भूरी लोमड़ी परिणाम कूद जल्दी भूरी लोमड़ी कूद गया ! परिणाम: द-क्विक-ब्राउन-फॉक्स-कूद

उदाहरण: त्वरित ब्राउन लोमड़ी - कूद गया! परिणाम: द-क्विक-ब्राउन-फॉक्स-कूद

उदाहरण: त्वरित ~ `# $%^& *() _ + = ------- ब्राउन {} |] [:" ?।! '; <>,/लोमड़ी - कूद परिणाम:-जल्दी भूरे लोमड़ी-कूद

उदाहरण: त्वरित 1234567890 ~ ​​`@ # $%^& *() _ + = - ----- ब्राउन {} |] [: ''; <>?,/लोमड़ी - कूद गया! परिणाम:-जल्दी 1234567890 भूरे लोमड़ी-कूद


किसी नियमित अभिव्यक्ति के लिए पता नहीं है?

धन्यवाद!

+0

जब आप शब्दों के बीच सीधे होते हैं तो आप हाइफ़न छोड़ना चाहेंगे (उदाहरण के लिए "कुछ चीज़" को "कुछ" में अनुवाद नहीं करना चाहिए) और अन्य विशेष मामलों। –

उत्तर

27

जब से तुम गैर अक्षरांकीय अक्षर के सभी दृश्यों चाहते करने लगते हैं एक भी हाइफन द्वारा प्रतिस्थापित किया जा, तो आप इस का उपयोग कर सकते हैं:

$str = preg_replace('/[^a-zA-Z0-9]+/', '-', $str); 

लेकिन यह आगे या पीछे हाइफ़न कि हो सकता है में परिणाम कर सकते trim के साथ हटा दिया:

$str = trim($str, '-'); 

और लोअरकेस में परिणाम कन्वर्ट करने के लिए, strtolower का उपयोग करें:

$str = strtolower($str); 

तो सब एक साथ:

$str = strtolower($str); 
$str = trim($str, '-'); 
$str = preg_replace('/[^a-z0-9]+/', '-', $str); 

या एक कॉम्पैक्ट एक लाइनर में:

$str = strtolower(trim(preg_replace('/[^a-zA-Z0-9]+/', '-', $str), '-')); 
+0

धन्यवाद! बहुत अच्छा काम करता है! – Paul

+2

मुझे लगता है कि एक बेहतर विकल्प है कि पहले व्हाइटस्पेस को प्रतिस्थापित करें, फिर गैर-व्हाइटस्पेस/गैर-अल्फान्यूमेरिक। कई मामलों में गैर-व्हाइटस्पेस, गैर-अल्फान्यूमेरिक वर्णों को डैश नहीं होना चाहिए। आईई: "महिला रात" "महिला-रात" होगी। मैं पहले डैश के साथ व्हाइटस्पेस ('/ \ s + /') को प्रतिस्थापित करता हूं, फिर रिक्त स्ट्रिंग के साथ अन्य सभी ('/ [^ a-zA-Z0-9] + /') को प्रतिस्थापित करता हूं। आप ट्रिम भी छोड़ सकते हैं। –

+0

उपरोक्त में संपादित करें: आपको दूसरे प्रतिस्थापन में डैश जोड़ने की आवश्यकता होगी: '/ [^ a-zA-Z0-9 \ -] + /' –

17

मैं बस कुछ इसी तरह के साथ काम कर रहा था, और मैं कोड के इस छोटे से टुकड़े के साथ आया था , यह लैटिन वर्णों के उपयोग पर भी विचार करता है।

$str = 'El veloz murciélago hindú comía fe<!>&@#$%&!"#%&?¡?*liz cardillo y kiwi. La cigüeña ¨^;.-|°¬tocaba el saxofón detrás del palenque de paja';

सबसे पहले मैं सिर्फ यह आसान बाद में उपयोग करने के लिए बनाने के लिए htmlentities को स्ट्रिंग परिवर्तित:

यह नमूना स्ट्रिंग है।

$friendlyURL = preg_replace('/&([a-z]{1,2})(?:acute|circ|lig|grave|ring|tilde|uml|cedil|caron);/i','\1',$friendlyURL);

तब मैं एचटीएमएल से वापस स्ट्रिंग परिवर्तित:

$friendlyURL = htmlentities($str, ENT_COMPAT, "UTF-8", false);

तब मैं उनकी संगत ASCII वर्ण (áa हो जाता है, ÜU हो जाता है, और इसी तरह) के साथ लैटिन वर्णों की जगह प्रतीकों के लिए इकाइयों, फिर बाद में आसान उपयोग के लिए।

$friendlyURL = html_entity_decode($friendlyURL,ENT_COMPAT, "UTF-8");

अगला मैं हाइफ़न में सभी गैर अक्षरांकीय अक्षर की जगह।

$friendlyURL = preg_replace('/[^a-z0-9-]+/i', '-', $friendlyURL);

मैं स्ट्रिंग अंदर अतिरिक्त हाइफ़न निकालें:

$friendlyURL = trim($friendlyURL, '-');

और अंत में छोटे अक्षरों में सभी परिवर्तित:

$friendlyURL = preg_replace('/-+/', '-', $friendlyURL);

मैं अग्रणी और अनुगामी हाइफ़न को दूर

$friendlyURL = strtolower($friendlyURL);

सभी एक साथ:

function friendlyUrl ($str = '') { 

    $friendlyURL = htmlentities($str, ENT_COMPAT, "UTF-8", false); 
    $friendlyURL = preg_replace('/&([a-z]{1,2})(?:acute|circ|lig|grave|ring|tilde|uml|cedil|caron);/i','\1',$friendlyURL); 
    $friendlyURL = html_entity_decode($friendlyURL,ENT_COMPAT, "UTF-8"); 
    $friendlyURL = preg_replace('/[^a-z0-9-]+/i', '-', $friendlyURL); 
    $friendlyURL = preg_replace('/-+/', '-', $friendlyURL); 
    $friendlyURL = trim($friendlyURL, '-'); 
    $friendlyURL = strtolower($friendlyURL); 
    return $friendlyURL; 

} 

टेस्ट:

$str = 'El veloz murciélago hindú comía fe<!>&@#$%&!"#%&-?¡?*-liz cardillo y kiwi. La cigüeña ¨^`;.-|°¬tocaba el saxofón detrás del palenque de paja'; 

echo friendlyUrl($str); 

परिणाम:

el-veloz-murcielago-hindu-comia-fe-liz-cardillo-y-kiwi-la-ciguena-tocaba-el-saxofon-detras-del-palenque-de-paja 

मुझे लगता है कि Gumbo का जवाब बेहतर आपकी समस्या को फिट बैठता है, और यह एक छोटी कोड है, लेकिन मैंने सोचा कि यह उपयोगी होगा दूसरो के लिए।

चीयर्स, एड्रियाना

+0

बिल्कुल सही !!!!!!!! – Leonardo

+0

सही काम करता है! मेरी जिंदगी बचाओ! धन्यवाद! – vinigarcia87

+0

5 साल बाद भी यह एक आकर्षण की तरह काम करता है। आसान, सरल, मुझे यह पसंद है। शुक्रिया जनाब! – LuBre

1

आप PHP में फ़ाइल नामों के लिए इस का उपयोग कर रहे हैं, तो Gumbo द्वारा जवाब होगा

$str = preg_replace('/[^a-zA-Z0-9.]+/', '-', $str); 
$str = trim($str, '-'); 
$str = strtolower($str); 

जोड़ा गया फ़ाइल नाम के लिए एक अवधि और यह strtolower(), नहीं strtolowercase() है।

6

एक समारोह में:

function sanitize_text_for_urls ($str) 
{ 
    return trim(strtolower(preg_replace(
     array('/[^a-z0-9-\s]/ui', '/\s/', '/-+/'), 
     array('', '-', '-'), 
     iconv('UTF-8', 'ASCII//TRANSLIT', $str))), '-'); 
} 

यह क्या करता है:

// Solve accents and diacritics 
$str = iconv('UTF-8', 'ASCII//TRANSLIT', $str); 

// Leave only alphanumeric (respect existing hyphens) 
$str = preg_replace('/[^a-z0-9-\s]/ui', '', $str); 

// Turn spaces to hyphens 
$str = preg_replace('/\s+/', '-', $str); 

// Remove duplicate hyphens 
$str = preg_replace('/-+/', '-', $str); 

// Remove trailing hyphens 
$str = trim($str, '-'); 

// Turn to lowercase 
$str = strtolower($str); 

नोट:
आप एक सरणी पारित करके कई preg_replace जोड़ सकते हैं। शीर्ष पर समारोह देखें।

उदाहरण के लिए:

// Électricité, plâtrerie --> electricite-platrerie 
// St. Lücie-Pétêrès   --> st-lucie-peteres 
// -Façade- & gros œuvre  --> facade-gros-oeuvre 

// _-Thè quîck ~`[email protected]#&$%^ &*()_+= ---{}|][ :"; <>?.,/ fóx - jümpëd_- 
// the-quick-fox-jumped 

संपादित करें: UTF8
संपादित करें का उपयोग करने के लिए regex के अंत में कहा, "/ u": डुप्लिकेट किए गए और प्रमुख/हाइफ़न अनुगामी लिए जिम्मेदार है, @LuBre

करने के लिए धन्यवाद
+0

मुझे लगता है कि अब तक यह सबसे अच्छा समाधान है। – barell

+0

अच्छा है, मैं किसी भी संभावित संभावित रिक्त स्थान को हटाने के लिए '$ str = preg_replace ('/- +/',' - ', $ str)' जोड़ दूंगा। उदाहरण: 'हैलो-कैसे --- हैं-आप' को 'हैलो-हाउ-यू-यू' में परिवर्तित कर दिया जाएगा। – LuBre

+0

धन्यवाद @LuBre, मैंने आपकी प्रतिक्रिया शामिल की – gabssnake

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