2015-07-28 68 views
2

我有一個包含html標記的字符串,如下所示。如何從PHP字符串中去除字符而不會干擾HTML標記

$desc = "<p>Lorem <strong>ipsum</strong> dolor sit amet</p><p>Duo at agam maiorum instructior, ut tale quidam ancillae qui, est cu paulo consetetur.</p>"

我想利用前10個字符,使得:

  1. HTML標籤是不計數的一部分。
  2. 已打開的所有HTML標籤都已正確關閉。

現在,如果使用SUBSTR:

$result = substr($desc, 0, 10); 

實際結果是:<p>Lorem <

我想是:<p>Lorem <strong>ipsu</strong></p>

+2

你最好用[DomDocument]解析它(http://php.net/manual/en/class.domdocument.php) – DevDonkey

+0

@MattHB你能告訴我如何用DomDocument做到這一點嗎? – alishaukat

+0

它會超出我的範圍,因爲我害怕給你這個細節的答案。然而,如果你在網站上搜索'DOMDocument',你會得到很多結果,這些結果會指向你正確的方向。 – DevDonkey

回答

0

我以一個非常漂亮的代碼從這裏 實現了這個How to close unclosed HTML Tags?回答kamal

<?php 
$str = "<p>Lorem <strong>ipsum</strong> dolor sit amet</p><p>Duo at agam maiorum instructior, ut tale quidam ancillae qui, est cu paulo consetetur.</p>"; 
$s = strip_tags($str); 
$result = substr($s, 0, 10); 
$sarr = explode(' ', $result); 
$last = end($sarr); 
$l = strpos($str, $last); 
$r = substr($str, 0, $l); 
echo closetags($r.$last); 

function closetags ($html) 
    { 
    #put all opened tags into an array 
    preg_match_all ("#<([a-z]+)(.*)?(?!/)>#iU", $html, $result); 
    $openedtags = $result[1]; 
    #put all closed tags into an array 
    preg_match_all ("#</([a-z]+)>#iU", $html, $result); 
    $closedtags = $result[1]; 
    $len_opened = count ($openedtags); 
    # all tags are closed 
    if(count ($closedtags) == $len_opened) 
    { 
    return $html; 
    } 
    $openedtags = array_reverse ($openedtags); 
    # close tags 
    for($i = 0; $i < $len_opened; $i++) 
    { 
     if (!in_array ($openedtags[$i], $closedtags)) 
     { 
     $html .= "</" . $openedtags[$i] . ">"; 
     } 
     else 
     { 
     unset ($closedtags[array_search ($openedtags[$i], $closedtags)]); 
     } 
    } 
    return $html; 
} 
?> 
相關問題