Рефакторинг кода

Печать / RSS
33


Господин ПЖ
0
Имеется вот такой код, реально ли его упростить?
<?php
/**
* Метод парсинга BBCode
* @param string $source текст содержаший BBCode
* @return string распарсенный текст
*/
public function parse($source) {
$source = nl2br($source);

foreach ($this->parsers as $name => $parser) {

if (isset($parser['iterate'])) {

for ($i=0; $i <= $parser['iterate']; $i++) {
if (isset($parser['callback'])) {
$source = preg_replace_callback($parser['pattern'], array($this, $parser['callback']), $source);
} else {
$source = preg_replace($parser['pattern'], $parser['replace'], $source);
}
}

} else {

if (isset($parser['callback'])) {
$source = preg_replace_callback($parser['pattern'], array($this, $parser['callback']), $source);
} else {
$source = preg_replace($parser['pattern'], $parser['replace'], $source);
}
}
}
return $source;
}
Изменил: Вантуз-мен (10.01.2015 / 15:26)

Господин ПЖ
0
2. ZiGR, последняя редакция тут https://github.com/visavi/rotorcms/blob/develop/includes/classes/BBCodeParser.php
А

Оранжевые штаны
0
А iterate зачем?

Добавлено через 06:14 сек.
<?php
public function parse($source) {
$source = nl2br($source);
foreach ($this->parsers as $name => $parser) {
for ($i=0; $i <= (isset($parser['iterate']))? $parser['iterate'] : 1; $i++) {
if (isset($parser['callback'])) {
$source = preg_replace_callback($parser['pattern'], array($this, $parser['callback']), $source);
} else {
$source = preg_replace($parser['pattern'], $parser['replace'], $source);
}
}
}
return $source;
}

Но ООП какое то натянутое, если честно. Да и трудозатратное решение выходит.
Ю

deleted
0
4. Башка, С воздухом между строк выглядит все-таки более приятно.
А

Оранжевые штаны
0
5. TakteS, дело вкуса

Добавлено через 05:29 сек.
Кстати, в foreach не нужна переменная $name.

Господин ПЖ
0
4. Башка, да вот как раз и хотелось бы избавиться от ненужных прогонов если нет замен при первой итерации

Добавлено через 02:40 сек.
Ну класс конечно так себе согласен, но по крайней мере работает намного быстрее всех других парсеров которые тестировал
к примеру http://jbbcode.com/ хороший расширяемый парсер, но работает более чем в 50 раз медленнее чем который я привел выше
А

Оранжевые штаны
0
7. Vantuz, щас накидаю что нибудь интересное.
V

Пришелец
0
Замени $i++ на ++$i
D

Добавлено через 05:39 сек.
Башка (10 Января 2015 / 17:11)
А iterate зачем?

Добавлено через 06:14 сек.
<?php
public function parse($source) {
$source = nl2br($source);
foreach ($this->parsers as $name => $parser) {
for ($i=0; $i <= (isset($parser['iterate']))? $parser['iterate'] : 1; $i++) {
if (isset($parser['callback'])) {
$source = preg_replace_callback($parser['pattern'], array($this, $parser['callback']), $source);
} else {
$source = preg_replace($parser['pattern'], $parser['replace'], $source);
}
}
}
return $source;
}

Но ООП какое то натянутое, если честно. Да и трудозатратное решение выходит.

Ты вкурсе что твой варик с
for ($i=0; $i <= (isset($parser['iterate']))? $parser['iterate'] : 1; $i++)
будет еще более тормозной.
Т.к. это условие будет проверятся с каждой итерацией.
Изменил: VITAMIN (10.01.2015 / 20:36)
А

Оранжевые штаны
0
9. VITAMIN, нет, я был не в курсе. Спасибо, что поправил, теперь я пуду писать код намного лучше!
А

Оранжевые штаны
0
На скорую руку.

Не думаю, что работать будет больно шустро, но здесь нет лишних проходов по одной и той же строке с целью замены.
Прикрепленные файлы:
parser.zip (3.64Kb)
Изменил: Артур (10.01.2015 / 21:15)
Для выполнения действия необходимо авторизоваться!
Стикеры / Теги / Правила / Топ тем / Топ тем / Поиск