2012-01-05 66 views
1

我試圖刪除任何用戶插入的圖像標籤,同時允許我自己的圖像圖標。我有這個使用PHP刪除用戶插入的圖像標籤

$post = 'Here is an image <img src="imgage.jpg" /> to check 
     and my icon <img src="/images/ImageLink.jpg" />'; 

$imgcheck = true; 
$stringstart = 0; 

while($imgcheck == 'true'){ 
    if($stringstart = strpos($post,'<img',$stringstart)){ 
     if ($stringend = strpos($post,'>',$stringstart)){ 
      $strlength = $stringend - $stringstart; 
      $substring = substr($post,$stringstart,$strlength); 
      if (!preg_match('/src="\/images\/ImageLink.jpg"/',$substring)){ 
       $post = str_replace($substring, "", $post); 
      } 
      else{ 
       $stringstart = $stringend; 
      } 

     } 
     else{ 
      $imgcheck = 'false'; 
     } 
    } 
    else{ 
      $imgcheck = 'false'; 
    } 

} 

我想這回

Here is an image to check and my icon <img src="/images/ImageLink.jpg" /> 

我似乎就對strpos功能之一將得到一個錯誤,但無法找出原因。

更新:謝謝你hakre。這個答案更加優雅。我也終於使與

$imgcheck = true; 
$stringstart = 0; 

while($imgcheck == 'true'){ 
    if($stringstart = strpos($post,'&lt;img',$stringstart)){ 
     if ($stringend = strpos($post,'&gt;',$stringstart)){ 
      $strlength = $stringend - $stringstart +4; 
      $substring = substr($post,$stringstart,$strlength); 
      if (!preg_match('~src="\/images\/ImageLink.jpg"~',$substring)){ 
       $post = str_replace($substring, "", $post); 
      } 
      else{ 
       $stringstart = $stringend; 
      } 

     } 
     else{ 
      $imgcheck = 'false'; 
     } 
    } 
    else{ 
      $imgcheck = 'false'; 
    } 

} 

&lt;因爲我使用一個div CONTENTEDITABLE =真正的用戶輸入使用&gt;代碼工作。這也可以通過簡單地用<img>更換&lt;&gt;分別以及改變

$strlength = $stringend - $stringstart +4; 

$strlength = $stringend - $stringstart +1; 

謝謝你的時間被用於文本區域。

+1

也許最好環視'strip_tags()'方法。 – MahanGM 2012-01-05 17:50:41

+0

strip_tags也會刪除我用jquery插入的圖像圖標。 – buck54321 2012-01-05 17:52:37

+0

所以在你的問題標題中要清楚。我不熟悉RegEx,通過一種簡單的方法,您可以先用'[MyIcon]'下一個'strip_tags'來替換您的圖標標籤,然後用您的圖標標籤替換[MyIcon]。這很骯髒,但是一個很好的竅門 – MahanGM 2012-01-05 17:57:11

回答

2

您應該爲作業使用HTML解析器,例如DOMDocument

下面的示例代碼就會把你的HTML片段插入一個div id爲post所以可以認定:

$post = 'Here is an image <img src="imgage.jpg" /> to check 
     and my icon <img src="/images/ImageLink.jpg" />'; 

$post = '<div id="post">'.$post.'</div>'; 

然後創建DOMDocument和HTML裝進去。此外,容器div可以通過它的ID作爲變量提供:

$doc = new DOMDocument(); 
$doc->loadHTML($post); 
$container = $doc->getElementById('post'); 

下一步是選擇要刪除的所有圖像。這是用xpath完成的。該xpatch表達然後將與$container查詢作爲參考:

$xpath = new DOMXPath($doc);  
$expression = './/img[@src != "/images/ImageLink.jpg"]'; 
$nodes = $xpath->query($expression, $container); 

下一步是遍歷所有找到的元素,併除去它們:

foreach($nodes as $node) 
{ 
    $parent = $node->parentNode; 
    $parent->removeChild($node); 
} 

最後改變的HTML需要被獲得性採取一切就$container的:

$innerHTML = ''; 
foreach($container->childNodes as $child) { 
    $innerHTML .= $node->ownerDocument->saveXML($child); 
} 

現在一切都在

echo $innerHTML; 

,這將給你:

Here is an image to check 
     and my icon <img src="/images/ImageLink.jpg"/> 

希望這是非常有用的。

+0

謝謝。發佈更新。 – buck54321 2012-01-05 18:37:56