PHP

2010-08-18 1 views
6

में टैग लिंक के साथ शब्दों को प्रतिस्थापित करना मेरे पास एक टेक्स्ट ($text) और शब्दों की एक सरणी ($tags) है। पाठ में ये शब्द अन्य पृष्ठों के लिंक के साथ प्रतिस्थापित किए जाने चाहिए ताकि वे टेक्स्ट में मौजूदा लिंक को तोड़ न सकें। केकेपीएचपी में टेक्स्टहेल्पर में ऐसा करने के लिए एक विधि है लेकिन यह दूषित है और यह पाठ में मौजूदा HTML लिंक को तोड़ देता है। विधि इस तरह काम करने के लिए लगता है:PHP

function highlight($text, $phrase, $highlighter = '<span class="highlight">\1</span>', $considerHtml = false) { 
    if (empty($phrase)) { 
    return $text; 
    } 

    if (is_array($phrase)) { 
    $replace = array(); 
    $with = array(); 

    foreach ($phrase as $key => $value) { 
     $key = $value; 
     $value = $highlighter; 
     $key = '(' . $key . ')'; 
     if ($considerHtml) { 
     $key = '(?![^<]+>)' . $key . '(?![^<]+>)'; 
     } 
     $replace[] = '|' . $key . '|ix'; 
     $with[] = empty($value) ? $highlighter : $value; 
    } 
    return preg_replace($replace, $with, $text); 
    } else { 
    $phrase = '(' . $phrase . ')'; 
    if ($considerHtml) { 
     $phrase = '(?![^<]+>)' . $phrase . '(?![^<]+>)'; 
    } 

    return preg_replace('|'.$phrase.'|i', $highlighter, $text); 
    } 
} 

उत्तर

0

इस कोड को बस ठीक काम करता है:

$text=Text->highlight($text,$tags,'<a href="/tags/\1">\1</a>',1); 

नीचे वहाँ CakePHP TextHelper में मौजूदा कोड है। आपको क्या करना पड़ सकता है <span class="highlight"> के लिए सीएसएस की जांच करें और सुनिश्चित करें कि यह कुछ रंगों पर सेट है जो आपको यह समझने की अनुमति देगा कि यह उच्च प्रकाश है।

.highlight { background-color: #FFE900; } 
+0

मैं हाइलाइटिंग के बारे में नहीं पूछ रहा हूं। कृपया प्रश्न पढ़ें। – Amorphous

+0

क्या आप देखने के लिए नमूना '$ टेक्स्ट' प्रदान करेंगे? जब मैं इसका परीक्षण करता हूं तो कोड ठीक काम करता है। मैं कहूंगा कि यह हो सकता है कि आप जिस 'टैग टैग' को प्रतिस्थापित करना चाहते हैं, पहले से परिभाषित '

0

असफ़ल - मैंने देखा कि गर्ट ने आपकी पोस्ट संपादित की है। क्या आप दो पोस्ट कोड बिल्कुल पोस्ट करते हैं?

तो मूल कोड को हाइलाइट करने के लिए डिज़ाइन किया गया था, लेकिन मुझे लगता है कि आप इसे लिंक बनाने के लिए इसे पुन: व्यवस्थित करने की कोशिश कर रहे हैं - इसे करना चाहिए और इसके लिए ठीक काम करता है (पोस्ट के रूप में परीक्षण किया जाता है)।

हाउवर पहले कोड खंड में भागने से कोई समस्या हो सकती है।

$text=Text->highlight($text,$tags,'<a href="/tags/\1">\1</a>',1); 

वर्क्स ठीक है ... लेकिन आप के बजाय उद्धरण चिह्न बैकस्लैश भागने के निशान के रूप में गायब हो जाते हैं स्पीच चिह्नों का उपयोग करता है, तो - आप उन्हें बचने के लिए की जरूरत है। अगर आपको% 01 लिंक नहीं मिलते हैं।

स्पीच अंकों के साथ सही तरीका है:

$text=Text->highlight($text,$tags,"<a href=\"/tags/\\1\">\\1</a>",1); 

(सूचना \ 1 1 के बजाय \ के उपयोग) एचटीएमएल में पाठ की जगह

1

सादा पाठ की जगह से मौलिक रूप से अलग है। यह निर्धारित करने के लिए कि पाठ एक HTML टैग का हिस्सा है या नहीं, आपको सभी टैग्स को उन पर विचार न करने के लिए ढूंढना आवश्यक है। Regex वास्तव में इसके लिए उपकरण नहीं है।

मैं नीचे दिए समाधान का प्रयास करेंगे:

  • सभी शब्दों के पदों का पता लगाएं। आखिरी से पहले कार्य करना, यह निर्धारित करना कि प्रत्येक टैग का हिस्सा है या नहीं। यदि नहीं, तो एंकर जोड़ें।
  • स्ट्रिंग को ब्लॉक में विभाजित करें। प्रत्येक ब्लॉक या तो एक टैग या सादा पाठ है। सादा पाठ ब्लॉक पर अपना प्रतिस्थापन चलाएं, और पुनः इकट्ठा करें।

मुझे लगता है कि पहला वाला शायद थोड़ा अधिक कुशल है, लेकिन प्रोग्रामर त्रुटि से अधिक प्रवण है, इसलिए मैं इसे आपके पास छोड़ दूंगा।

यदि आप जानना चाहते हैं कि मैं सीधे इस समस्या का सामना क्यों नहीं कर रहा हूं, साइट पर रेगेक्स और एचटीएमएल के बारे में सभी प्रश्नों को देखें, और रेगेक्स एक पार्सर नहीं है।

2

आप देख सकते हैं (और चलाने) यहाँ इस एल्गोरिथ्म:

http://www.exorithm.com/algorithm/view/highlight

यह थोड़ा बेहतर और सरल कुछ परिवर्तनों के साथ बनाया जा सकता है, लेकिन यह अभी भी सही नहीं है। हालांकि कम कुशल, मैं बेन डूम के समाधानों में से एक की सिफारिश करता हूं।

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