2012-12-15 3 views
5

के अंदर "कुछ शब्द" को बाहर करना चाहिए, मेरे पास डेटाबेस तालिका में HTML सामग्री संग्रहीत है। उस HTML सामग्री में मैं एक लिंक टैग के साथ "कुछ शब्द" को प्रतिस्थापित करना चाहता हूं। लेकिन अगर "कुछ शब्द" पहले से ही एक लिंक टैग के अंदर है तो मुझे उन्हें छोड़ देना चाहिए ..PHP नियमित अभिव्यक्ति, लेकिन लिंक टैग

उदा।
सामग्री

<p>Lorem ipsum dolor SOME WORDS, consectetur adipiscing elit. <a href="http://example.com">SOME WORDS</a> elementum pharetra velit at cursus. Quisque blandit, nibh at eleifend ullamcorper</p> 

उत्पादन

<p>Lorem ipsum dolor <a href="http://someurl">SOME WORDS</a>, consectetur adipiscing elit. <a href="http://example.com">SOME WORDS</a> elementum pharetra velit at cursus. Quisque blandit, nibh at eleifend ullamcorper</p> 

होना चाहिए जैसा कि आप देख सकते हैं, यह मौजूदा लिंक ग्रंथों को बाहर रखना चाहिए जब जगह।

सही ट्रैक में आने के लिए कुछ मार्गदर्शन बहुत सराहना की है।

+2

नियमित अभिव्यक्ति का उपयोग न करें, जैसे DOMDocument –

+0

कोशिश एक HTML पार्सर का उपयोग करें - http://www.solmetra.com /scripts/regex/index.php - और - http://weblogtoolscollection.com/regex/regex.php - और कुछ अन्य बकवास। – qooplmao

+1

उस लड़की को अंगूठी से याद रखें? उसने HTML को संसाधित करने के लिए नियमित अभिव्यक्तियों का उपयोग करने की कोशिश की, और देखें कि उसके साथ क्या हुआ! –

उत्तर

3

इससे आपको इसके नियमित अभिव्यक्ति के बजाय DOMDocument का उपयोग कर हल कर सकता है:

$contents = <<<EOS 
<p>Lorem ipsum dolor SOME WORDS, consectetur adipiscing elit. <a href="http://example.com">SOME WORDS</a> elementum pharetra velit at cursus. Quisque blandit, nibh at eleifend ullamcorper</p> 
EOS; 

$doc = new DOMDocument; 
libxml_use_internal_errors(true); 
$doc->loadHTML($contents); 
libxml_clear_errors(); 

$xp = new DOMXPath($doc); 

// find all text nodes 
foreach ($xp->query('//text()') as $node) { 
     // make sure it's not inside an anchor 
     if ($node->parentNode->nodeName !== 'a') { 
       $node->nodeValue = str_replace(
        'SOME WORDS', 
        'SOME OTHER WORDS', 
        $node->nodeValue 
       ); 
     } 
} 
// DOMDocument creates a full document and puts your fragment inside a body tag 
// So we enumerate the children and save their HTML representation 
$body = $doc->getElementsByTagName('body')->item(0); 
foreach ($body->childNodes as $node) { 
     echo $doc->saveHTML($node); 
} 
+0

धन्यवाद .. इस समस्या को हल किया .. मैंने एक HTML पार्सर का उपयोग करने के बारे में सोचा नहीं .. – sanandrl

+0

आपका स्वागत है।एचटीएमएल पार्सर्स अध्ययन करने के लिए एक महान विषय हैं :) –

0

यह चाल करना चाहिए।

बस regex में जाँच कुछ शब्दों को अगर यह सटीक वाक्यांश और उसमें मौजूद लिंक किसी अन्य प्रतीकों या शब्दों के बिना केवल काम करेंगे टैग से घिरा हुआ है, तो

preg_replace('/[^>]SOME WORDS[^<]/','<a href="http://someurl">SOME WORDS</a>',$str); 
+2

यह कुछ इस तरह टूट जाएगा: here are SOME WORDS for you

1

सरल regex। आप SOME WORDS की सभी घटनाओं के माध्यम से यह देखने के लिए पुन: प्रयास कर सकते हैं कि वे घटना से पहले एक उद्घाटन और समापन लिंक टैग की मात्रा की गणना करके एक लिंक के अंदर हैं या नहीं।

$str = '<p>Lorem ipsum dolor SOME WORDS, consectetur adipiscing elit. <a href="http://example.com">SOME WORDS</a> elementum pharetra velit at cursus. Quisque blandit, nibh at eleifend ullamcorper</p>'; 
echo 'Before:' . $str; 
$str_lc = strtolower($str); 
$phrase = 'SOME WORDS'; 
$link = '<a href="http://someurl">SOME WORDS</a>'; 
$offset = 0; 
while($position = strpos($str, $phrase, $offset)) 
{ 
    if (substr_count($str_lc, "<a", 0, $position) <= substr_count($str_lc, "</a>", 0, $position)) { 
     $str = substr_replace($str, $link, $position, strlen($phrase)); 
     $str_lc = strtolower($str); 
     $offset = $position + strlen($link) - strlen($phrase); 
    } else { 
     $offset = $position + 1; 
    } 
} 
echo 'After:' . $str; 
1

यदि आपके पास कमरे 3 लाइनों के लिए यह एक सुरक्षित शर्त होगी: इस कोड का प्रयास करें

$text=preg_replace('~<a(.*)(SOME WORDS)(.*)</a>~','<a$1PLACEHOLDER$3</a>',$text); 
$text=preg_replace('~SOME WORDS~','REPLACEMENT WORDS',$text); 
$text=preg_replace('~PLACEHOLDER~','SOME WORDS',$text); 

यह एक प्लेसहोल्डर पाठ/टैग का उपयोग करेगा/जो कुछ भी है ताकि आप एक लिंक की जगह नहीं है सामग्री (यदि कोई है तो)।