2012-01-05 2 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; и &gt; используется, потому что я использую DIV с contenteditable = верно для ввода данных пользователя. Это также может быть использован для текстовой области, просто заменив &lt; и &gt; с <img и > соответственно, а также изменения

$strlength = $stringend - $stringstart +4; 

в

$strlength = $stringend - $stringstart +1; 

Спасибо за ваше время.

+1

Возможно, лучше рассмотреть метод 'strip_tags()'. – MahanGM

+0

strip_tags также удалит мои иконки изображений, которые вставляются с jquery. – buck54321

+0

Так что будьте понятны в заголовке вопроса.Я не знаком с RegEx. В простой форме вы можете сначала заменить теги значков на определенную метку, как '[MyIcon]' next 'strip_tags', а затем заменить значок [MyIcon] на значок значка. Это грязный, но хороший трюк. – MahanGM

ответ

2

Вы должны использовать HTML-парсер для задания, например DOMDocument.

В следующем примере кода поместит свой HTML-фрагмент в DIV с идентификатором 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 становится доступным в качестве переменной по его идентификатору:

$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