2011-02-02 6 views
8

मैं एक स्ट्रिंग है लग रहा है जैसे:पीएचपी: http हटाने `: //` लिंक शीर्षक से

$string = '<a href="http://google.com">http://google.com</a>';

मैं कड़ी पाठ से http:// हिस्सा कैसे निकाल सकता है, लेकिन href में छोड़ विशेषता?

+0

आप मिल सकती है [ 's ($ str) -> प्रतिस्थापन ('http: //') '] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php#L305) सहायक, जैसा कि [इस स्टैंडअलोन में पाया गया है) पुस्तकालय] (https://github.com/delight-im/PHP-Str)। – caw

उत्तर

11

एक पूर्ण विकसित पार्सर का उपयोग कर के बिना, इस ज्यादातर स्थितियों के लिए काम कर सकता है ...

$str = '<a href="http://google.com">http://google.com</a>'; 

$regex = '/(?<!href=["\'])http:\/\//'; 

$str = preg_replace($regex, '', $str); 

var_dump($str); // string(42) "<a href="http://google.com">google.com</a>" 

यह एक नकारात्मक lookbehind का उपयोग करता है यकीन है कि कोई href=" या href=' यह पूर्ववर्ती बनाने के लिए।

See it on IDEone

यह उन लोगों को भी ध्यान में रखता है जो ' के साथ अपने गुण मान को सीमित करते हैं।

+0

जो काम करता है, टीएक्स। इस विचार को अच्छी साइट पर, आप वास्तव में इस पर PHP कोड चला सकते हैं :) – Alex

+0

@Alexandra कोई चिंता नहीं, यह एक अच्छा सवाल है! – alex

9
$string = '<a href="http://google.com">http://google.com</a>'; 
$var = str_replace('>http://','>',$string); 

बस IDEone.com में यह कोशिश की और इसका वांछित प्रभाव है।

+1

@ardman ... PHP ?? !!! नरक जमे हुए जरूरी है! –

+2

बस वहां फेंकने लायक है, यह '> http: // ... 'नहीं पकड़ पाएगा, लेकिन यदि आप पहले से रिक्त स्थान को ट्रिम करते हैं तो इसे करना चाहिए। – Robert

+0

मुझे नहीं पता कि यह क्यों काम करता है लेकिन यह काम नहीं करता है, मुझे खाली स्ट्रिंग मिलती है .. – Alex

1
$string = '<a href="http://google.com">http://google.com</a>'; 
$var = explode('http://',$string); 
echo $var[2]; 
2

किसी भी साधारण नियमित अभिव्यक्ति या स्ट्रिंग प्रतिस्थापन कोड शायद सामान्य मामले में विफल रहा है। ऐसा करने का एकमात्र "सही" तरीका वास्तव में एक एसजीएमएल/एक्सएमएल स्निपेट के रूप में खंड को पार्स करना है और मूल्य से http:// को हटा देना है।

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

+0

ठीक है, गलत तरीका अभी भी अधिक उपयुक्त है। यहां ओवरकिल समाधान (एचटीएमएल पार्सर) का उपयोग करके वारंट करने के लिए पर्याप्त एज केस क्षमता नहीं है। एक नियमित अभिव्यक्ति पर्याप्त है। (एचटीएमएल पार्सिंग मेमे के लिए कोई रेगेक्स कुछ हद तक दिनांकित नहीं है।) – mario

+1

एक आदमी का "मेमे" एक और आदमी की शुद्धता है।हम नहीं जानते कि यह हर समय काम करने के लिए कितना महत्वपूर्ण है, या इनपुट कितना भरोसेमंद हो सकता है। रेगेक्स शायद काम करेगा, लेकिन मैं @ एलेक्सेंड्रा को इंप्रेशन देना नहीं चाहता हूं कि हर संभव इनपुट के लिए उनकी समस्या हल हो गई है। –

2

मानते हैं कि "http: //" हमेशा $ स्ट्रिंग पर दो बार दिखाई देता है, स्ट्रिप्स का उपयोग करके "http: //" पीछे स्ट्रिंग को खोजें। यदि खोज सफल हो जाती है, तो आप "http: //" के start_index को जान लेंगे जिसे आप निकालना चाहते हैं (और आप निश्चित रूप से लंबाई जानते हैं)। अब आप उस सबकुछ को निकालने के लिए सबस्ट्रेट का उपयोग कर सकते हैं जो उस खंड के पहले और बाद में जाता है जिसे आप निकालना चाहते हैं।

4

इस साधारण मामले में, preg_replace फ़ंक्शन शायद काम करेगा। और अधिक स्थिरता के लिए, DOMDocument प्रयोग करके देखें:

$string = '<a href="http://google.com">http://google.com</a>'; 
$dom = new DOMDocument; 
$dom->loadXML($string); 

$link = $dom->firstChild; 
$link->nodeValue = str_replace('http://', '', $link->nodeValue); 
$string = $dom->saveXML($link); 
+0

बस एक बढ़त का मामला, आप यह सुनिश्चित करने के लिए रेगेक्स का उपयोग करना चाह सकते हैं कि आप इसे केवल शुरुआत से ही बंद कर दें, 'http://example.com/send-to-friend?url=http:// जैसे लिंक के बारे में क्या है। somewhere.com'? इसके अलावा, एक पार्सर का उपयोग करने के लिए +1। – alex

3
$str = 'http://www.google.com'; 
$str = preg_replace('#^https?://#', '', $str); 
echo $str; // www.google.com 

कि दोनों http के लिए काम करेंगे: // और https: //

running live code

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