#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.