Заменить первое вхождение строки, которой нет между тегами кавычек в PHP - PullRequest
0 голосов
/ 15 января 2012

Я хочу заменить первое вхождение строки ("[TOREPLACE]") в сообщении на форуме vbulletin, но только если эта строка не окружена тегами цитат bbcode.

Мой код:

if($firstpos = strpos($post['pagetext'], '[TOREPLACE]') !== false){

    //check for quote
    if($quote_start = strpos($post['pagetext'], '[QUOTE') !== false && $quote_end = strpos($post['pagetext'], '[/QUOTE]') !== false){
        //quote found
        //check if quote starts before egg
        if($quote_start < $firstpos && $firstpos < $quote_end){

            //don't replace, because the string that is to be replace is in between quotes
        }
    }

    $post['pagetext_html'] = preg_replace('~\[TOREPLACE\]~i', '<img src="/src.jpg" border="0" />', $post['pagetext_html'], 1);

}

Я должен был бы зациклить это, чтобы найти первое вхождение строки, которая не находится в кавычках Эта проверка цитаты утомительна и не очень элегантна. Кто-нибудь знает лучший алгоритм для выполнения вышесказанного?

Алгоритм: "Если в сообщении есть кавычки - найдите и замените первое вхождение, которого нет между тегами кавычек. Если кавычек нет, замените первое вхождение."

Может быть, я мог бы добавить все это в pre_match. Однако кавычки необязательны, и я не знаю, как это сделать.

1 Ответ

1 голос
/ 16 января 2012

Это немного более элегантно и не разбивается на несколько частей цитируемого текста:

// for clarity, START and END are used instead of the actual (un)quote pattern

$input = "test text START quoted text END more text START quoted again END.";
$parts = preg_split("/(START.+?END)/",$input,-1,PREG_SPLIT_DELIM_CAPTURE);

// $parts is an array containing quoted parts at odd indexes
print_r($parts);

выход:

Array
(
    [0] => test text 
    [1] => START quoted text END
    [2] =>  more text 
    [3] => START quoted again END
    [4] => .
)

Затем переберите $parts и измените только четные индексы. После этого:

$output = implode($parts);
...