Сделать строку из строки красной, если найден символ кавычки

#php #html #preg-match

#php #HTML #preg-match

Вопрос:

Я пытаюсь сделать каждую строку из строки красной, если найден символ кавычки «>». Я делаю это с определенным результатом запроса к базе данных, и это работает; однако он возвращает разрыв строки HTML после каждого «совпадения кавычек» следующим образом:

 text
>text

text
text
  

Почему это?

 function quote_colors($text) {
    $lines = explode("n", $text);
    foreach ($lines as $index => $line) {
        if (preg_match('/^>/', strip_tags($line))) {
            $lines[$index] = "<span style='color:red;'>{$line}</span>";
        }
    }
    $text = implode("n", $lines);

    return $text;
}

echo nl2br(quote_colors($row['post']));
  

ОБНОВЛЕНИЕ — это результат с красным текстом:

 <span style="color:#AABC68;">>test<br /></span><br />
  

И без:

 <span style="color:#AABC68;">>test</span>
  

Комментарии:

1. Возможно, это натяжка, но исключили ли вы лишние символы перевода строки или возврата каретки в этих строках в необработанном тексте?

2. Да, строка базы данных — это просто четыре строки с надписью «текст», а вторая строка со стрелкой

3. Значит, все-таки были возвраты каретки.

Ответ №1:

Вам не нужно разбивать текст по строкам:

 function quote_colors($text) {
    return preg_replace('~^>[^rn]*~m', '<span style="color:red;">$0</span>', $text);
}
  

Модификатор m изменяет значение ^ якорей на начало строки, тогда вам нужно сопоставить только строки, начинающиеся с >

Комментарии:

1. Отличная очистка кода! Тем не менее, первоначальная проблема сохраняется… Ответ Ивана кажется слишком громоздким с HTML / CSS

2. Ну, каждая строка строки имеет <br/> в базе данных, много ли это значит?

3. @user1228907: Нет, вы правы, это потому, что точка соответствует символу возврата каретки r . Теперь это исправлено.

Ответ №2:

Сначала вы генерируете текст постоянного типа (каждая строка с промежутком), а затем устанавливаете расстояние между строками с помощью css:

 function quote_colors($text) {
    $lines = explode("n", $text);
    foreach ($lines as $index => $line) {
        if (preg_match('/^>/', strip_tags($line))) {
            $lines[$index] = "<span class='color-row' style='color:red;'>".htmlspecialchars($line)."</span>";
        } else {
            $lines[$index] = "<span  class='color-row' style='color:black;'>".htmlspecialchars($line)."</span>";
        }

    }
    $text = implode("n", $lines);

    return $text;
}

echo nl2br(quote_colors($row['post']));
  

пример css:

 .color-row{
  height: 1em;
}
  

Комментарии:

1. К сожалению, не повезло

Ответ №3:

Конец строк вашего текста закодирован в стиле Windows, rn но вы взрываетесь на n . С нетронутым текстом nl2br() можно справиться с этим. Но когда вы заменяете свою временную строку a, инкапсулируя ее с помощью span , она сохраняет символ возврата каретки, r и nl2br() превращает это в тег разрыва строки HTML. Я рекомендую нормализовать ваши разрывы строк либо перед вставкой в базу данных, либо после извлечения текста из базы данных, поэтому с этого момента вам нужно учитывать только один стиль EOL.