Вам нужно будет использовать условные подшаблоны здесь.Предполагая, что теги <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
).