2012-12-15 28 views
5

Tôi có nội dung html được lưu trữ trong bảng cơ sở dữ liệu. trong nội dung html mà tôi muốn thay thế "MỘT SỐ TỪ" bằng một thẻ liên kết. Nhưng nếu "MỘT SỐ TỪ" đã có trong thẻ liên kết, tôi nên bỏ qua chúng ..biểu thức chính quy php để thay thế "một số từ" bằng thẻ liên kết, nhưng phải loại trừ "một số từ" bên trong thẻ liên kết

ví dụ:
Nội dung

<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> 

Sản lượng nên

<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> 

như bạn có thể thấy, nó nên loại trừ các văn bản liên kết hiện có khi thay thế.

Một số hướng dẫn để đi đúng hướng được đánh giá rất cao.

+2

Không sử dụng biểu thức thông thường, sử dụng một phân tích cú pháp HTML như DOMDocument –

+0

Hãy thử - http://www.solmetra.com /scripts/regex/index.php - và - http://weblogtoolscollection.com/regex/regex.php - và một số crap khác. – qooplmao

+1

Hãy nhớ rằng cô gái từ chiếc nhẫn? Cô đã cố gắng sử dụng các biểu thức thông thường để xử lý HTML quá, và xem những gì đã xảy ra với cô ấy! –

Trả lời

3

Đây là cách bạn có thể giải quyết nó bằng cách sử DOMDocument thay vì biểu thức thông thường:

$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

cảm ơn .. điều này giải quyết được vấn đề .. Tôi đã không nghĩ về việc sử dụng một trình phân tích html .. – sanandrl

+0

Bạn đang chào đón.Trình phân tích cú pháp HTML là một chủ đề tuyệt vời để nghiên cứu :) –

0

Điều này sẽ thực hiện thủ thuật.

Chỉ cần kiểm tra trong regex nếu một số từ được bao quanh bởi thẻ

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

điều này sẽ phá vỡ tại một cái gì đó như: here are SOME WORDS for you

1

Simple regex sẽ chỉ làm việc nếu đó là cụm từ chính xác và bên trong liên kết mà không cần bất kỳ biểu tượng hoặc nói cách khác. Bạn có thể lặp qua tất cả các lần xuất hiện của SOME WORDS để xem liệu chúng có nằm trong một liên kết hay không bằng cách tính toán số lần có thẻ liên kết mở và đóng trước khi xảy ra. Hãy thử mã này:

$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

Nếu bạn có chỗ cho 3 dòng này sẽ là một cược an toàn:

$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); 

Nó sẽ sử dụng một văn bản GIỮ CHỖ/thẻ/bất cứ điều gì để bạn không thay thế một liên kết nội dung (trong trường hợp có một).

Các vấn đề liên quan