Оберните написать цитаты с HTML-элемента


Мне интересно, если я мог обрабатывать следующие ситуации с одной функции или выражения называют. С учетом ввода следующие:

Some text

> Foo
> Bar
>> Baz
> Foo

Вывод должен быть:

Some text

<blockquote>
Foo
Bar
    <blockquote>
        Baz
    </blockquote>
Foo
</blockquote>

Следующие две функции не справиться с этой ситуацией, но я думаю, что там должен быть более элегантный способ справиться с этим. Я думал о регулярных выражениях, но не мог придумать любой узор, который заменяет ввод и вывод (см. выше).

<?php
function toArray($str, $currLevel = 0, $i = 0) {
  $return = array();
  $lines = explode("\n", $str);
  for($j = count($lines); $i < $j; $i++) {
    $line = trim($lines[$i]);
    $level = preg_replace('/^((?:>|\s)+).*/','\1', $line);
    $level = substr_count($level, '>');
    if($level == $currLevel) {
      array_push($return, preg_replace('/^((?:>|\s)+)(.*)/','\2', $line));
    }
    else if($level > $currLevel) {
      array_push($return, toArray(join("\n", $lines), $currLevel  + 1, &$i));
    } else if($level < $currLevel) {
      $i--;
      return $return;
    }
  }

  return $return;
}

function toQuote($lines) {
  $return = "<blockquote>\n";
  foreach($lines as $line) {
    if(is_array($line)) {
      $return .= toQuote($line);
    }
    else {
      $return .= $line . "\n"; 
    }
  }
  $return .= "</blockquote>\n";
  return $return;
}

$str = <<<INPUT
  Some text

  > Foo
  > Bar
  >> Baz
  > Foo
INPUT;

echo toQuotes(toArray($str));


966
4
php
задан 27 мая 2011 в 11:05 Источник Поделиться
Комментарии
1 ответ

Это не намного более элегантным, но, возможно, Вам понравится:

$text = "Some text

> Foo
> Bar
>> Baz
> Foo
";

function clean($text) {
$result = "";
$lines = explode("\n", $text);
foreach($lines as $key => $line) {
$lines[$key] = preg_replace('/(>)+ /', '', $line);
}
return join("\n", $lines);
}

function quotes($text, $level = 1) {
$search = str_repeat(">", $level);
$fstpos = strpos($text, $search);
$sndpos = strrpos($text, $search);
$sndpos = strpos($text, "\n", $sndpos);
$middle = substr($text, $fstpos, $sndpos + 1);
if($fstpos === false or $sndpos === false)
return clean($middle, $search);
$fst = clean(substr($text, 0, $fstpos), $search);
$snd = clean(substr($text, $sndpos), $search);
return $fst . "<blockquote>\n" . quotes($middle, $level + 1) . "</blockqoute>" . $snd;
}

echo quotes($text);

2
ответ дан 2 июня 2011 в 11:06 Источник Поделиться