2012-05-13 9 views
6
$pattern = "/\[(.*?)\]\((.*?)\)/i"; 
$replace = "<a href=\"$2\" rel=\"nofollow\">$1</a>"; 
$text = "blah blah [LINK1](http://example.com) blah [LINK2](http://sub.example.com/) blah blah ?"; 
echo preg_replace($pattern, $replace, $text); 
ऊपर काम करता है

लेकिन अगर एक जगह गलती से [] और() सब कुछ टूट जाता है और दो लिंक एक में मिलाया जाता है के बीच डाला जाता है: यहमेरा PHP रेगेक्स क्यों है जो मार्कडाउन लिंक को तोड़ देता है?

$text = "blah blah [LINK1] (http://example.com) blah [LINK2](http://sub.example.com/) blah blah ?"; 

मैं एक महसूस कर रही है Laxy स्टार है कि यह टूट जाता है है लेकिन यह नहीं पता कि दोहराने वाले लिंक से मिलान कैसे करें।

+0

के बीच में जोड़ा इस Markdown पार्सर के कुछ प्रकार है? यदि हां, तो आप पहले से मौजूद किसी का उपयोग क्यों नहीं करते? – Gumbo

+0

यह है। मुझे केवल आईडी और शीर्षक की आवश्यकता के बिना मूल लिंक फ़ंक्शन की आवश्यकता है। – user1070125

उत्तर

7

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

/\[([^]]*)\] *\(([^)]*)\)/i 

स्पष्टीकरण:

\[    # Matches the opening square bracket (escaped) 
([^]]*)  # Captures any number of characters that aren't close square brackets 
\]    # Match close square bracket (escaped) 
*    # Match any number of spaces 
\(   # Match the opening bracket (escaped) 
([^)]*)  # Captures any number of characters that aren't close brackets 
\)    # Match the close bracket (escaped) 

औचित्य:

मुझे शायद यह उचित ठहराना चाहिए कि मैंने .*? को [^]]*

में बदल दिया

दूसरा संस्करण अधिक कुशल है क्योंकि इसे .*? करता है की बड़ी मात्रा में बैकट्रैक करने की आवश्यकता नहीं है। इसके अतिरिक्त, एक बार का उद्घाटन होने के बाद, .*? संस्करण तब तक देखेगा जब तक कि यह एक टैग न हो, चाहे वह एक टैग न हो, जैसा कि हम चाहते हैं। उदाहरण के लिए, हम के खिलाफ .*? का उपयोग कर अभिव्यक्ति से मेल खाते हैं, तो:

Sad face :[ blah [LINK1](http://sub.example.com/) blah 

यह

[ blah [LINK1] 

और

http://sub.example.com/ 

से मेल खाएगी [^]]* दृष्टिकोण का उपयोग मतलब है कि इनपुट सही ढंग से मिलान किया जाता है।

+0

इस में एक टाइपो है लेकिन मैं इसे ठीक नहीं कर सकता क्योंकि मुझे यकीन नहीं है कि इसे कैसे काम करना है। – user1070125

+0

आप सही हैं, मैंने टाइपो को ठीक किया है और – Jarmex

+0

के लिए एक स्पष्टीकरण जोड़ा है। मैंने एक औचित्य भी जोड़ा है कि मैंने '। *?' में '[^]] *' – Jarmex

0

इस प्रयास करें:

$pattern = "/\[(.*?)\]\s?\((.*?)\)/i"; 

\s?\[(.*?)\] और \((.*?)\)

+0

कि किसी भी तरह से एक ही स्थान की देखभाल करने में काम करता है। मुझे लगता है कि यह बेहतर सख्त मार्कअप की आवश्यकता होगी और बाकी सब कुछ अनदेखा करेगा (आउटपुट जैसा है)। – user1070125