Необходимо сохранять новые строки в предварительных тегах, удаляя новые строки из всего остального текста


У меня есть текст, отправленный пользователем через форму, который может содержать несколько блоков текста в предварительных тегах. Мне нужно удалить все новые строки, не удаляя новые строки в ПРЕДВАРИТЕЛЬНЫХ тегах, и сохранить любое другое пользовательское форматирование.

Author: hakre, 2011-05-15

2 answers

Здесь вам нужно будет использовать условные подшаблоны. Предполагая, что теги <pre> и </pre> являются сбалансированными , следующий код должен работать для вас:

$str = "abc \nfoo\n <pre>123\ndef\nabc\n</pre>qwer\nttt\n bbb";
$p = '~((<pre>)(?(2).*?</pre>)(?:[^\n]*?))*?\n~smi';
$s = preg_replace($p, "$1", $str);
var_dump($s);

ВЫВОД

string(42) "abc foo <pre>123
def
abc
</pre>qwerttt bbb"

Как вы можете видеть \n снаружи <pre> и </pre> были удалены.

Этот код ищет 0 или более вхождений текста между тегом <pre> в строке и, если он найден, захватывает текст до тега </pre>. Одиночная итерация поиска останавливается, когда сначала \n найден, а затем он заменяет сопоставленный текст первой захваченной группой (т. Е. текстом, который появился раньше \n).

 1
Author: anubhava, 2011-05-15 05:00:27
$input = // whatever

$tokenized_input = explode('<pre>', $input); 
for($i = 0; $i < count($tokenized_input); ++$i) {
  $substrings = split('</pre>', $tokenized_input[$i]);
  if (!empty($substrings)) {
    $substrings[count($substrings) - 1] = str_replace("\n", '', $substrings[count($substrings) - 1]);
  }
  $tokenized_input[$i] = implode('</pre>', $substrings);
}

$output = implode('<pre>', $tokenized_input);

Обратите внимание, что я не проверял это. Он также предполагает, что:
- Все ваши теги <pre> написаны в нижнем регистре, без атрибутов
- Вы пытаетесь удалить только символы новой строки, а не \r\n

 0
Author: Sam Dufel, 2011-05-15 04:59:42