|
|
|
| Есть текст, что-то типа:
<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);
|
вот такое регулярное выражение не спасает((( | |
|
|
|
|
|
|
|
для: Sturmvogel
(10.02.2012 в 21:51)
| | > если они встречаются внутри TD только один раз
Это что значит? От вашего примера должно остаться , как я понял. А если
<TD>
<DL>
<DT>text<DT>
text</DL>
<DL>
<DT>text<DT>
text</DL>
</TD>
| , то что должно остаться?
И то что тег <DT> не закрывается это так задумано, или это опечатка? | |
|
|
|
|
|
|
|
для: Sfinks
(10.02.2012 в 22:07)
| | во втором случае должно остаться все, как есть....
насчет закрывающегося тега сам не знаю, потому что мне поставляют исходный текст, который нужно пропарсить именно в таком виде. | |
|
|
|
|
|
|
|
для: Sturmvogel
(10.02.2012 в 22:15)
| | ну так в примере <DT> 2 раза встречается. Должно остаться как я в первый раз написал или
<TD>
<DT>text<DT>
text
</TD>
| ? | |
|
|
|
|
|
|
|
для: Sfinks
(10.02.2012 в 22:26)
| | я думаю, можно удалять | |
|
|
|
|
|
|
|
для: 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 ) == 1 ){
$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]);
?>
|
| |
|
|
|
|
|
|
|
для: 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 ) == 1 ){
$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>";
|
| |
|
|
|