Вы можете использовать регулярные выражения на основе замены строки:
<?php
$input = <<< EOT
[###TITLE###]
Passed in 12%.
[###TITLE###]
1 to 2% dearer. Maintained throughout the day.
[###TITLE###]
18.5m finer 2 to 3% dearer. 19.0m coarser 1 to 2% dearer.
[###TITLE###]
19.5m finer 1 to 2% dearer. 20.0m coarser firm.
EOT;
$output = preg_replace(
'/(\])\s+([^\[]*)\s+(\[)?/m',
"\\1\n<div class=\"text\">\\2</div>\n\\3",
$input
);
var_dump($output);
Выход этого:
string(323) "[###TITLE###]
<div class="text">Passed in 12%. </div>
[###TITLE###]
<div class="text">1 to 2% dearer. Maintained throughout the day. </div>
[###TITLE###]
<div class="text">18.5m finer 2 to 3% dearer. 19.0m coarser 1 to 2% dearer. </div>
[###TITLE###]
<div class="text">19.5m finer 1 to 2% dearer. 20.0m coarser firm.</div>
"
Примечание: позаботиться о том, есть завершающее пустое пространство в конце ввода , иначе выражение будет выдавать немного другой результат. Если сомневаетесь просто добавить один символ пробела к входу ;-)
Другой подход, в моих глазах гораздо более гибким, является конструктивным создание желаемых результатов. Для этого вы сначала используете многострочный захват на основе регулярных выражений. После этого вы можете обработать вывод именно так, как вам нравится:
<?php
$input = <<< EOT
[###TITLE###]
Passed in 12%.
[###TITLE###]
1 to 2% dearer. Maintained throughout the day.
[###TITLE###]
18.5m finer 2 to 3% dearer. 19.0m coarser 1 to 2% dearer.
[###TITLE###]
19.5m finer 1 to 2% dearer. 20.0m coarser firm.
EOT;
preg_match_all('/(\\[.+\\]\s+)([^\[]*\s*)\s/', $input, $tokens);
$output = '';
for($i=0; $i<count($tokens[0]); $i++) {
$output .= sprintf("%s<div class=\"text\">%s</div>\n", $tokens[1][$i], $tokens[2][$i]);
}
var_dump($output);
Выход здесь снова:
string(330) "[###TITLE###]
<div class="text">Passed in 12%. </div>
[###TITLE###]
<div class="text">1 to 2% dearer. Maintained throughout the day. </div>
[###TITLE###]
<div class="text">18.5m finer 2 to 3% dearer. 19.0m coarser 1 to 2% dearer. </div>
[###TITLE###]
<div class="text">19.5m finer 1 to 2% dearer. 20.0m coarser firm.</div>
"
Внимание: в обоих случаях, чтобы убедиться, что фактическое название и содержание строки до не содержат квадратные скобки, кроме тех, которые фактически ограничивают название. Обработка таких случаев возможна, но делает вещи намного сложнее.
Каков ожидаемый выход? –
Я только что отредактировал :) –
И почему 'Passed in ..' не завернуты? –