2013-10-14 4 views
0

Я хочу добавить блоккоты в мой парсер, например Stack Overflow, где > используются для обозначения части blockquote.Синтаксис Blockquote Markdown

Вот что я делаю, чтобы начать класс:

<?php 

$string = "This is a paragraph 

> This is a blockquote 
> This is a blockquote 
> This is a blockquote 

This is another paragraph 
"; 
$md = new Markdown(); 
echo $md->parseString($string); 

Вот что я делаю в классе для анализа Цитаты, проблема в том, что она не находит часть я хочу для цитирования.

<?php 
$this->string = preg_replace("/^>(.+?)/is", "<blockquote>$1</blockquote>", $this->string); 

Что я могу сделать, чтобы найти эти многострочные блокировки?

+0

вы хотите один BLOCKQUOTE тег для каждой строки, или один BLOCKQUOTE тег для всех последовательных линий? –

+0

один тег блока для всех последовательных строк. –

ответ

1

Вы могли бы сделать замену с помощью обратного вызова /(?:^>.+\n)+/m затем в обратном вызове сделать возврат результата заменить $ матч [0] с помощью этой /^>/m «»

return '<blockquote>' + preg_replace('/^>/m', "", $match[0]) + '</blockquote>'; 

(Я новичок в PHP)

+0

Это не работает ... Выполнение: 'preg_match_all ("/(?: ^> [^ \ S \ n] + \ n) +/m ", $ this-> string, $ matches); print_r ($ matches); 'дает мне пустой массив. –

+0

Используйте ''/(?: ^>. + \ N) +/m'' (вы поймали меня между изменениями). – sln

+0

Или вы можете использовать ''/(?: ^> [^ \ N] + \ n) +/m'' – sln

0

вы можете сделать это:

$subject = <<<'LOD' 
This is a paragraph 

> This is a blockquote 
> This is a blockquote 
> This is a blockquote 

This is another paragraph 
LOD; 

$pattern = '~(?<=(\n)|)\R> (.*)(?=(\R>)?)~'; 

$result = preg_replace_callback($pattern, function ($match) { 
    $before = (empty($match[1])) ? '' : '<blockquote>'; 
    $after = (empty($match[3])) ? '</blockquote>' : ''; 
    return $before . $match[2] . $after; }, $subject); 

print_r($result); 
Смежные вопросы