Рег. выражение. Удаление ссылок из HTML

forester

Новичок
Рег. выражение. Удаление ссылок из HTML

В строках вставлены ссылки. В каждой может быть одна или более ссылок. Ссылки надо убрать.
Делаю так
PHP:
$line = preg_replace('/(<A HREF=")(.*)(">)/', '', $line);
Если ссыка одна, то все нормально, но если две и более, то удаляется весь кусок текста между первым <A HREF=" и последним ">.
Как в выражении указать, чтобы подразумевалась только одна ссылка
 

sense

Новичок
function strip_tag($str, $tag)
// Убивает ТЕГ $tag (открывающий с атрибутами и без и закрывающий) по всему тексту
{
$str=eregi_replace("<$tag([ ]*)[^>]*>", " ", $str);
$str=eregi_replace("</$tag>", " ", $str);
return $str;
}


НО эта функция оставляет собержимое ссылки (то что подчёркивается в броузере)
 

WP

^_^
Фи. pcre рулит, posix ацтой. Чичас сделаю.
PHP:
function strip_tag($string,$tag,$intag = FALSE)
{
 $s = preg_quote($tag,'~');
 return preg_replace('~<\s*'.$s.'(\s.*?)?>'.($intag?'.*?':'|').'</'.$s.'>~si','',$string);
}
$string = '...1
<a href="url1">link1</a> test1
<a href="url2">link2</a> test2
<a href="url3">link3</a> test3
...2';
echo '"'.strip_tag($string,'a')."\"\n";
echo '"'.strip_tag($string,'a',TRUE)."\"\n";
/*
"...1
link1 test1
link2 test2
link3 test3
...2"
"...1
 test1
 test2
 test3
...2"
*/
Если intag истина то удаляет внутри тега тоже, с минимальной жадностью.
И сравни эти реализации по скорости :)

P.S. sense еще нужно было сделать проверку на пробельный символ, и желательно экранирование спец-символов.
 

God

Новичок
Мдя, а если вызвать функцию sense так:
PHP:
strip_tag('<body>xcvxcvx <b>sd</b>fsdfs </body>', 'b');
 

AlexFree

Новичок
$line = preg_replace('|<a.*?href=*.?>(.+?)</a>|is', '$1', $line);

Вот так грамотно, красиво и сработает.
 

Video-VV

Новичок
Если кому нужны извраты :) на PHP без POSIX и PCRE
Вот такой код под удаление любого тега из HTML строки.
PHP:
  /*******************************************************************
    Удаление любых ЗАКРЫВАЮЩИХСЯ тегов (ссылок) из строки, теги типа: 
      1) <a name.. или <a href...
      2) <div...
      3) <td.....и прочие
         регистр тега НЕВАЖЕН!
    По умолчанию: удаление тега <a...></a>
    Параметры: 
                  $cBodyHTML - строка с HTML
                  $Tag - имя тега (строка) по умолчанию 'а'
                  $lc_encod - кодировка $cBodyHTML,  по умолчанию UTF-8
     Возвращает $cBodyHTML без указанного в $Tag тега
  *******************************************************************/
  function DeleteTagInString( $cBodyHTML, $Tag='a', $lc_encod='UTF-8') {
   
    $begTag = mb_strtolower('<'.$Tag,      $lc_encod);
    $endTag = mb_strtolower('</'.$Tag.'>', $lc_encod);
    $cBodyHTML = str_replace( mb_strtoupper('<'.$Tag     , $lc_encod ), $begTag, 
                 str_replace( mb_strtoupper('</'.$Tag.'>', $lc_encod ), $endTag  , $cBodyHTML ));
    $aBody = explode( $endTag, $cBodyHTML );
    for($i=0;$i<count( $aBody );$i++ ) {
      $nPosTag = mb_strpos( $aBody[$i], $begTag, 0, $lc_encod );
      if( $nPosTag!==false) {
        $cc_Body0 = mb_substr( $aBody[$i], 0, $nPosTag, $lc_encod );
        $cc_Body1 = mb_substr( $aBody[$i], $nPosTag, mb_strlen( $aBody[$i], $lc_encod ), $lc_encod );
        $nPosLG = mb_strpos( $cc_Body1, '>', 0, $lc_encod );
        if( $nPosLG!==false) {
           $cc_Body2 = mb_substr( $cc_Body1, ($nPosLG+1), mb_strlen( $cc_Body1, $lc_encod ), $lc_encod );
           $aBody[$i] = str_replace( $endTag,'',$cc_Body0.$cc_Body2);
        }
      }
    }
    return ( implode('',$aBody) );
  }
Например:
PHP:
 $cHTML= '<td> <a name="aname" class="wow" style="color:#000;">123</A> </td>'. 
         '<br />'.
         '<a href="http://test.ru/noname.html" target="_top" title="text" class="tot">Тест</a></td> '.
         '<td><div id="noname" title="text" class="tot">Тест</div></td> '.
         '<td><div style="color:#f00;" class="tot" />Картинка</div></td>';
                             
  echo "1)\n ".DeleteTagInString( $cHTML, 'a'    ); 
  echo "2)\n ".DeleteTagInString( $cHTML, 'div'  );  
  echo "3)\n ".DeleteTagInString( $cHTML, 'td' );
Получаем в исходном HTML коде:
PHP:
1)  /* удалены только теги <a...> </a> */ 
  <td> 123 </td><br />Тест</td> <td><div id="noname" title="text" class="tot">Тест</div></td> 
  <td><div   style="color:#f00;" class="tot" />Картинка</div></td>

2) /* удалены теги <div...> </div> */
  <td> <a name="aname" class="wow" style="color:#000;">123</A> </td><br />
  <a href="http://test.ru/noname.html" target="_top" title="text" class="tot">Тест</a></td> 
  <td>Тест</td> <td>Картинка</td>

3) /* удалены только теги <td...> </td>*/
  <a name="aname" class="wow" style="color:#000;">123</A> <br />
  <a href="http://test.ru/noname.html" target="_top" title="text" class="tot">Тест</a> 
  <div id="noname" title="text" class="tot">Тест</div> 
  <div style="color:#f00;" class="tot" />Картинка</div>
И самое удивительное, работает довольно быстро. :) Хотя и извращение...
 

Vin-Diesel

Новичок
Есть ли инструменты для работы с HTML на PHP по аналогу с css и jquery
т.е. что-то вроде этого:
PHP:
$css->html= '<td> <a name="aname" class="wow" style="color:#000;">123</A> </td>'. 
'<br />'.
'<a href="http://test.ru/noname.html" target="_top" title="text" class="tot">Тест</a></td> '.
'<td><div id="noname" title="text" class="tot">Тест</div></td> '.
'<td><div style="color:#f00;" class="tot" />Картинка</div></td>';
$css->select('.aname')->css('display: none');
 
Сверху