2016-12-10 4 views
0

Я эта строка извлекается из моей базы данныхWrap PHP строку в тег

[###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. 

Мой вопрос: Как можно обернуть только текст между ###] и [###
(Я хочу завернуть в DIV текст без [### TITLE ###]

PS:. весь текст просто строка

Ожидаемый результат

[###TITLE###] 
Passed in 12%. 
[###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> 

Как извлечь из базы данных по одной переменной только [### TITLE ###] , а в другой переменной остальная часть текста.

+0

Каков ожидаемый выход? –

+0

Я только что отредактировал :) –

+0

И почему 'Passed in ..' не завернуты? –

ответ

0

Вы можете использовать регулярные выражения на основе замены строки:

<?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> 
" 

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