PDA

Просмотр полной версии : как отпарсить?


x88x
27.03.2008, 20:58
блин, совсем меня штырит =)

вобщем, простенькая задачка: есть файл вида:
<p>вопрос1</p>
<p>ответ1</p>
<p>ответ2</p>
<p>ответ3</p>
<p>ответ4</p>
<p>ответ5</p>
<img>
<hr>
<p>вопрос2<p>
<p>ответ1<p>
<p>ответ2<p>
<p>ответ3<p>
<hr>

нужно с помощью пхп привести его в вид:
вопрос1|ответ1|ответ2|ответ3. .......
вопрос2|ответ1|ответ2|ответ3. .......

и т.д.
в долгу не останусь ;)

De-visible
27.03.2008, 21:14
нужно с помощью пхп привести его в вид:
Можно на Delphi реализовать

x88x
27.03.2008, 21:16
Можно на Delphi реализовать
блин. в принципе, не принципиально, но хотелось бы на пхп :rolleyes:

Piflit
27.03.2008, 21:25
если в вопросе всегда есть знак вопроса '?', то можно взять все ~<p>([^<]*\?)</p>~ будут вопросы, а ~<p>([^<?]*)</p>~ - ответы

.:EnoT:.
27.03.2008, 21:28
Если текст именно такой, то можно в принципе просто заменой распарсить...но лучше конечно по регулярке...
<?php
$a = '<p>вопрос1</p> <p>ответ1</p> <p>ответ2</p> <p>ответ3</p> <p>ответ4</p> <p>ответ5</p>
<img> <hr> <p>вопрос2</p> <p>ответ1</p> <p>ответ2</p> <p>ответ3</p> <hr>';

$a = str_replace('<p>', ' ', $a);
$a = str_replace('</p>', '|', $a);
$a = str_replace('<hr>', "\n", $a);
$a = strip_tags($a);
echo $a;
?>
Ещё раз повторю что имхо лучше регуляркой, а то щас умники будут возникать...

d_x
27.03.2008, 21:30
Толком не понял, как должен выглядеть результат, нужно по тегу <hr> раздулять ещё на строки? А тег <img> к чему? И почему во второй части заданного тс примера теги <p> не закрывающиеся в конце строк?

Сделал как понял и первое, что пришло в голову :)

$txt="<p>вопрос1</p>\n<p>ответ1</p>\n<p>ответ2</p>\n<p>ответ3</p>\n<p>ответ4</p>\n<p>ответ5</p>\n<img>\n<hr>\n<p>вопрос2</p>\n<p>ответ1</p>\n<p>ответ2</p>\n<p>ответ3</p>\n<hr>";


$txt=str_replace('</p>','',$txt);
$txt=str_replace('<img>','',$txt); //не понял, зачем <img>, удаляем
$txt=str_replace("\n",'',$txt);

$txt=explode('<hr>',$txt);

$ans='';

foreach($txt as $txt2)
{
$txt2=explode('<p>',$txt2);

foreach($txt2 as $txt3)
{
if($txt3) $ans.=$txt3.'|';
}

$ans.="\n";
}

print_r($ans);
Хотя если б было точнее условие, написал бы регулярку наверно)

VDShark
27.03.2008, 21:32
что б особо не извращаться с составлением выражения можн распарсить в два подхода... код ниже

<?php
$str = file_get_contents('1.txt');
$pattern = "!(.+)<hr>!Uis";
preg_match_all($pattern, $str, $res);
$pattern = "!<p>(.+)</p>!Uis";
foreach($res[1] as $row){
preg_match_all($pattern, $row, $tmp);
}

в результате на каждой итерации в массиве $tmp будет 0-й элемент - это вопрос, остальные - ответы.

x88x
27.03.2008, 21:58
всем огромное спасибо!!! выручили как всегда =)
проставлюсь завтра (Вы добавили слишком много репутации...)

=)

desTiny
27.03.2008, 22:01
блин, совсем меня штырит =)

вобщем, простенькая задачка: есть файл вида:
<p>вопрос1</p>
<p>ответ1</p>
<p>ответ2</p>
<p>ответ3</p>
<p>ответ4</p>
<p>ответ5</p>
<img>
<hr>
<p>вопрос2<p>
<p>ответ1<p>
<p>ответ2<p>
<p>ответ3<p>
<hr>

нужно с помощью пхп привести его в вид:
вопрос1|ответ1|ответ2|ответ3. .......
вопрос2|ответ1|ответ2|ответ3. .......

и т.д.
в долгу не останусь ;)
<?php
$ff = file_get_contents('a.htm');
$a = explode("<hr>",$ff);
$a = preg_replace('/\r\n/', '', $a);
$a = preg_replace('/<p>([^<]*)<\\/p>/', '$1|', $a);
$a = preg_replace('/<[\/\!]*?[^<>]*?>/', '', $a);
for ($i = 0; $i < count($a); $i++){
echo substr($a[$i], 0, -1)."<BR>\r\n";
}
?>

desTiny
27.03.2008, 22:01
блин..не успел:(

x88x
27.03.2008, 22:07
блин..не успел:(
все равно спасибо =)
радует такое количество помогающих ;)

.:EnoT:.
27.03.2008, 22:07
Йа извращенец =/
<?php
$a = '<p>вопрос1</p> <p>ответ1</p> <p>ответ2</p> <p>ответ3</p> <p>ответ4</p> <p>ответ5</p>
<img> <hr> <p>вопрос2</p> <p>ответ1</p> <p>ответ2</p> <p>ответ3</p> <hr>';

$arr = explode('<hr>', $a);
for($i=0; $i<count($arr); $i++)
{
$str = explode(' ', strip_tags(trim($arr[$i])));
echo implode('|', $str).'<br/>';
}
?>