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

У меня есть текст, отправленный пользователем через форму, которая может содержать несколько блоков текста в предварительных тегах.Мне нужно удалить все новые строки, не удаляя новые строки в тегах PRE, и сохранить любое другое пользовательское форматирование.

Ответы [ 2 ]

1 голос
/ 15 мая 2011

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

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

OUTPUT

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

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

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

0 голосов
/ 15 мая 2011
<code>$input = // whatever

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

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

...