在从所有其他文本中删除换行符时,需要在预标记中保留换行符

时间:2011-05-15 04:33:35

标签: php string-formatting

我通过表单提交了用户提交的文本,该文本可能在预标记中包含多个文本块。我需要删除所有换行符,而不删除PRE标记中的换行符,并保留任何其他用户格式。

2 个答案:

答案 0 :(得分:1)

您需要在此处使用条件子模式。假设<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>已被删除。

此代码在字符串中的<pre>标记之间搜索0次或更多次文本,如果找到,则会抓取文本,直到</pre>标记。单个迭代搜索在找到第一个\n时停止,然后将匹配的文本替换为第一个捕获的组(即\n之前的文本)。

答案 1 :(得分:0)

$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