Рефакторинг кода
1.
Вантуз-мен (10.01.2015 / 15:21)
Имеется вот такой код, реально ли его упростить?
<?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;
}
2.
Вантуз-мен (10.01.2015 / 17:02)
2.
ZiGR, последняя редакция тут
https://github.com/visavi/rotorcms/blob/develop/includes/classes/BBCodeParser.php
3.
Артур (10.01.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;
}
Но ООП какое то натянутое, если честно. Да и трудозатратное решение выходит.
4.
юЮЮфюв (10.01.2015 / 17:42)
4.
Башка, С воздухом между строк выглядит все-таки более приятно.
5.
Артур (10.01.2015 / 17:51)
5.
TakteS, дело вкуса
Добавлено через 05:29 сек.
Кстати, в foreach не нужна переменная $name.
6.
Вантуз-мен (10.01.2015 / 18:32)
4.
Башка, да вот как раз и хотелось бы избавиться от ненужных прогонов если нет замен при первой итерации
Добавлено через 02:40 сек.
Ну класс конечно так себе согласен, но по крайней мере работает намного быстрее всех других парсеров которые тестировал
к примеру
http://jbbcode.com/ хороший расширяемый парсер, но работает более чем в 50 раз медленнее чем который я привел выше
7.
Артур (10.01.2015 / 19:48)
7.
Vantuz, щас накидаю что нибудь интересное.
8.
VITAMIN (10.01.2015 / 20:29)
Замени $i++ на ++$i
Добавлено через 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++)
будет еще более тормозной.
Т.к. это условие будет проверятся с каждой итерацией.
9.
Артур (10.01.2015 / 20:45)
9.
VITAMIN, нет, я был не в курсе. Спасибо, что поправил, теперь я пуду писать код намного лучше!
10.
Артур (10.01.2015 / 21:14)
На скорую руку.
Не думаю, что работать будет больно шустро, но здесь нет лишних проходов по одной и той же строке с целью замены.
11.
Артур (10.01.2015 / 22:05)
12.
ZiGR, он автоматом генериться, нужно только пару значений вписать.
12.
Вантуз-мен (10.01.2015 / 22:58)
11.
Башка, Вроде норм, но пока останусь на своем варианте
URL:
https://visavi.net/topics/41842