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

Печать RSS
330

Автор
Господин ПЖ
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)
Стикеры / Теги / Правила / Топ тем / Топ постов / Поиск