2010-07-06 13 views
6

के लिए जांचें, हालांकि मैं यह other question पढ़ रहा था, जिसमें नौकरी के लिए कुछ वास्तव में अच्छा रेगेक्स है लेकिन जहां तक ​​मैं उनमें से कोई भी नहीं देख सकता हूं, बाश कमांड के साथ काम करते हैं क्योंकि बीएएसएच कमांड इस तरह के जटिल रेक्सग का समर्थन नहीं करते हैं।वैध लिंक (यूआरएल)

if echo "http://www.google.com/test/link.php" | grep -q '(https?|ftp|file)://[-A-Z0-9\+&@#/%?=~_|!:,.;]*[-A-Z0-9\+&@#/%=~_|]'; then 
    echo "Link valid" 
else 
    echo "Link not valid" 
fi 

लेकिन इस ग्रेप -q काम नहीं करता है के रूप में काम नहीं करता है ...

संपादित, ठीक है मैं सिर्फ महसूस किया कि ग्रेप एक "विस्तारित-रेगुलर एक्सप्रेशन" था (ई) विकल्प ऐसा लगता है कि यह काम करता है। लेकिन अगर किसी के पास बेहतर/तेज़ तरीका है तो भी मैं इसके बारे में यहां से प्यार करूंगा।

+0

आप इस प्रश्न पूछने के लिए अपनी प्रेरणा की जांच कर सकते हैं। प्रोग्रामर यूआरएल/यूआरआई और ई-मेल पते के स्थिर मूल्यांकन करने का प्रयास करते हैं जिन्हें आप सिंटैक्टिक रूप से वैध मान सकते हैं लेकिन आपको उनकी पहुंच के बारे में कुछ नहीं बताते हैं। उदाहरण के लिए, 'http: // www.example.com/bogus # fragment' हमेशा वाक्य रचनात्मक रूप से मान्य होगा और संभवतः (संभवतः) 404 त्रुटि लौटाएगा। – msw

+0

इस फ़ंक्शन को यह जानने की आवश्यकता नहीं है कि लिंक काम करता है या नहीं, बस यह एक लिंक है। – Mint

+0

एक यूआरएल क्या उपयोग करता है जो संसाधन को कभी नहीं ढूंढता है? जांच भी परेशान क्यों? – msw

उत्तर

14

बैश> = संस्करण 3.2 में निम्न काम करता है grep का उपयोग किए बिना:

regex='(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]' 
string='http://www.google.com/test/link.php' 
if [[ $string =~ $regex ]] 
then 
    echo "Link valid" 
else 
    echo "Link not valid" 
fi 

आपका regex लोअरकेस अल्फा वर्ण [a-z] शामिल करने के लिए प्रतीत नहीं होता है तो मैं उन्हें यहाँ गयी।

+2

'http: // печки-лавочки.рф /' के साथ बग जो वैध यूआरएल है। Http://stackoverflow.com/questions/161738 –

+0

पर एक और पूर्ण regex पाया जा सकता है, उदाहरण के लिए उदासीन रूप से काम कर रहा है (विशेष रूप से मुझे कुछ यूआरएल में समाप्त होना चाहिए। एमपी 3), निकोलस राउल, दो समस्याएं: 1. मैं था बैश समाधान की खोज नहीं PHP! (हमेशा बैश के साथ काम नहीं करते हैं, और कनवर्ट करना आसान नहीं है), अंतर्राष्ट्रीय SUX, यह आमतौर पर केवल उस देश में लागू होता है और जो सभी का दौरा करना चाहते हैं, मानक एसीआईआई के बाहर chrs का उपयोग नहीं करेंगे (मैं ऐसे देश में रह रहा हूं और हर कीमत पर इससे बचने की कोशिश करें) ... मैं आपके बारे में भी बात नहीं कर रहा हूं, समाधान के रूप में चिह्नित उत्तर नहीं है ... – THESorcerer

+0

यह सहायक था। लेकिन मुझे लगता है कि आप 'कचरा http: // google.com' जैसे स्ट्रिंग से गुजरने के लिए रेगेक्स को एंकर करना चाहते हैं। मैंने क्रमशः रेगेक्स की शुरुआत और अंत में^और $ जोड़ा, जैसे: 'regex = '^ (https? | Ftp | फ़ाइल): // [-A-Za-z0-9 \ + & @ # /% = ~ _ |:?!।,;] * [- एक-zA-Z0-9 \ + और @ # /% = ~ _ |] $ ' ' –

1

शायद क्योंकि नियमित अभिव्यक्ति पीसीआरई वाक्यविन्यास में लिखी गई है। देखें कि आपके सिस्टम पर प्रोग्राम pcregrep प्रोग्राम है (या इंस्टॉल कर सकता है) - इसमें grep के समान वाक्यविन्यास है लेकिन पर्ल-संगत रेगेक्स स्वीकार करता है - और आपको वह काम करने में सक्षम होना चाहिए।

एक और विकल्प -P विकल्प grep पर विकल्प का प्रयास करना है, लेकिन मैन पेज का कहना है कि यह "अत्यधिक प्रयोगात्मक" है, इसलिए यह वास्तव में काम कर सकता है या नहीं।

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

EDIT: प्रश्न में आपके संपादन के जवाब में, मैंने यह नहीं देखा कि रेगेक्स "विस्तारित" वाक्यविन्यास में भी मान्य है। मुझे नहीं लगता कि आप इससे बेहतर/तेज हो सकते हैं।

+0

यह केवल बैकएंड है, कुछ भी प्रदर्शित होने से पहले PHP में अधिक सत्यापन किया जाएगा। – Mint

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