Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Повтор текста 1 раз
 
 автор: Sturmvogel   (10.02.2012 в 21:51)   письмо автору
 
 

Есть текст, что-то типа:
<TD>
<DL>
<DT>text<DT>
text</DL>
</TD>

Мне нужно удалить эти DL, /DL, DT, если они встречаются внутри TD только один раз с сохранением текста.

$file = preg_replace("/<TD>(.*?)(<DL>|<\/DL>|<DD>)?(.*?)<\/TD>/i", '<TD>$1$3</TD>', $file);


вот такое регулярное выражение не спасает(((

  Ответить  
 
 автор: Sfinks   (10.02.2012 в 22:07)   письмо автору
 
   для: Sturmvogel   (10.02.2012 в 21:51)
 

> если они встречаются внутри TD только один раз
Это что значит? От вашего примера должно остаться
<TD> 
 
text 
text 
</TD>
, как я понял. А если
<TD> 
<DL> 
<DT>text<DT> 
text</DL> 
<DL> 
<DT>text<DT> 
text</DL> 
</TD>
, то что должно остаться?
И то что тег <DT> не закрывается это так задумано, или это опечатка?

  Ответить  
 
 автор: Sturmvogel   (10.02.2012 в 22:15)   письмо автору
 
   для: Sfinks   (10.02.2012 в 22:07)
 

во втором случае должно остаться все, как есть....

насчет закрывающегося тега сам не знаю, потому что мне поставляют исходный текст, который нужно пропарсить именно в таком виде.

  Ответить  
 
 автор: Sfinks   (10.02.2012 в 22:26)   письмо автору
 
   для: Sturmvogel   (10.02.2012 в 22:15)
 

ну так в примере <DT> 2 раза встречается. Должно остаться как я в первый раз написал или
<TD> 
 
<DT>text<DT> 
text 
</TD>
?

  Ответить  
 
 автор: Sturmvogel   (10.02.2012 в 22:38)   письмо автору
 
   для: Sfinks   (10.02.2012 в 22:26)
 

я думаю, можно удалять

  Ответить  
 
 автор: Sfinks   (10.02.2012 в 23:04)   письмо автору
 
   для: Sturmvogel   (10.02.2012 в 22:38)
 

Ну я надеюсь вы не думали это одним РВ сделать? Для этого слишком много условий. Можно так сделать:
<?php
  preg_match_all
("#(<td>)(.*?)(</td>)#si",$text,$out1);
  foreach(
$out1[2] as $key => $td_text){
    if( 
preg_match_all"#<dl>(.*?)</dl>#si" $td_text $out2 ) == ){
      
$dl_text preg_replace"#<dt>#si" "" $out2[1][0] );
      
$td_text preg_replace"#<dl>.*?</dl>#si" $dl_text $td_text );
    }
    
$out1[0][$key] = $out1[1][$key].$td_text.$out1[3][$key];
  }
  
print_r($out1[0]);
?>

  Ответить  
 
 автор: Sfinks   (10.02.2012 в 23:14)   письмо автору
 
   для: Sturmvogel   (10.02.2012 в 22:38)
 

Если заранее известно, что <TD> ... </TD> встречается 1 раз и написано заглавными буквами, можно упростить до такого:
<?
  preg_match
("#<TD>(.*?)</TD>#s",$text,$out1);
  if( 
preg_match_all"#<dl>(.*?)</dl>#si" $out1[1] , $out2 ) == ){
    
$dl_text preg_replace"#<dt>#si" "" $out2[1][0] );
    
$out1[1] = preg_replace"#<dl>.*?</dl>#si" $dl_text $out1[1] );
  }
  
$text "<TD>".$out1[1]."</TD>";

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования