2017-01-29 3 views
-1

Я хочу, чтобы удалить комментарии из строки документации:Обрезка звездочек от начала строки документации линий

/** 
* 
* Another method 
* 
* * This is a bullet point 
* 
* @return [type] [description] 
*/ 

Into:

Another method 

* This is a bullet point 

@return [type] [description] 

То, что я до сих пор:

<?php 
$string = substr($docstring, 3, -2); // Strips opening/closing tags 
$string = preg_replace('/^\s*\*\s*/m', '', $string); 

Unforunately , регулярное выражение работает не очень хорошо и дает мне следующее:

* Another method 
@return [type] [description] 

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

следующее изменение, казалось многообещающим, но он не работает либо:

/^\s*\*\s*?(?=>\S|$)/m 

Edit: Чтобы уточнить, я хочу, чтобы урезать только одна звездочка от начала линии

+0

Найти: '/\*\*.*?\*/', заменить пустой строкой, это работает для вас? –

+0

Я бы воспользовался http://ideone.com/nqyv03. 1) Совместите все многострочные комментарии, 2) обрезать звездочки и пробелы в начале каждой строки. –

ответ

-1

В моем вопросе я упомянул, что /^\s*\*\s*?(?=>\S|$)/m обещает.

Получается, что pcre просто не любит многострочный режим с lookaheads. Таким образом, чтобы получить тот же эффект, я избавилась от опережающего просмотра и сделал его захват и заменить:

<?php 
$string = substr($docstring, 3, -2); // Strips opening/closing tags 
$string = preg_replace('/^\s*\*\s*?(\S|$)/m', '\1', $string); 
0

Это должно достаточно:

$docstring = '/** 
* 
* Another method 
* @return [type] [description] 
*/'; 

$result = preg_replace('~^[\s*/]+~m', '', $docstring); 
0

Я не вижу, что не так в вашем коде и дублирует ваш результат. Но следующий код кажется работающим.

$string = preg_replace('/^[\s\*]+/m', '', $string); 
+0

Это позволит обрезать несколько звездочек с начала строки, я хочу, чтобы она обрезала один (и окружающие пробелы) –

0

Это должно работать. Зачем использовать lookahead, если вы можете его оставить?

preg_replace('/^\W?\*?+\W?/m', '', $str); 
0

Прежде всего, необходимо разобрать фрагмент кода, чтобы извлечь многострочные комментарии с помощью token_get_all():

function docBlocks($code) 
{ 
    return array_filter(token_get_all($code), function($token) { 
      if ($token[0] == T_DOC_COMMENT) { 
       if (preg_match('~^\s*/\*\*~', $token[1])) { 
        return true; 
       } 
      } 
     } 
    ); 
} 

Затем нанесите подставляя звездочки и удаление комментирующих разделителей:

var_dump(preg_replace(['~/\*\*~', 
    '~\s*\*/~', 
    '~^ *\*~m'], 
    '', 
    array_column(docBlocks($snippet), 1)) 
); 

Выход:

array(2) { 
    [0]=> 
    string(82) " 

Another method 

* This is a bullet point 

@return [type] [description]" 
    [1]=> 
    string(82) " 

Another method 

* This is a bullet point 

@return [type] [description]" 
} 

PHP live demo

0

Я понимаю, что здесь происходит, и может объяснить, почему вы получили то, что вы получили.

Ниже содержание $ строка:

* 
* Another method 
* @return [type] [description] 

Тогда регулярное выражение '/^\ S * \ * \ S */м' будет соответствовать все до второго *, потому что \ S также будет соответствовать новой строки.Тогда первые две строки будут считаться/рассматриваться как одна строка, а вторая * останется неуправленной.

Смежные вопросы