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

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
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++)
будет еще более тормозной.
Т.к. это условие будет проверятся с каждой итерацией.

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