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

发布于 2024-11-07 11:17:32 字数 81 浏览 0 评论 0 原文

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

I have user-submitted text via form that could have multiple blocks of text in pre tags. I need to remove all newlines, without removing the newlines in the PRE tags, and preserve any other user formatting.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

小苏打饼 2024-11-14 11:17:32

您需要在此处使用条件子模式。假设

标签是平衡的,以下代码应该适合您:

$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);

OUTPUT

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

如您所见

之外的 >\n 已被删除。

此代码在字符串中的

 标记之间搜索 0 次或多次出现的文本,如果找到,则抓取文本,直到 

标记< /强>。当找到第一个 \n 时,搜索的单次迭代就会停止,然后用第一个捕获的组(即 \n 之前的文本)替换匹配的文本。

You will need to use conditional subpatterns here. Assuming <pre> and </pre> tags are balanced, following code should work for you:

$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);

OUTPUT

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

As you can see \n outside <pre> and </pre> have been removed.

This code searches for 0 or more occurrences of text between <pre> tag in the string and if found then grabs text until </pre> tag. Single iteration of search stops when first \n is found and and then it replaces the matched text with first captured group (i.e. text that came before \n).

謌踐踏愛綪 2024-11-14 11:17:32
$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);

请注意,我没有对此进行测试。它还假设:
- 您的

 标签全部小写,没有属性
- 您试图仅删除换行符,而不是 \r\n

$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);

Note that I didn't test this. It also assumes that:
- Your <pre> tags are all lowercase, with no attributes
- You're trying to remove only newline characters, not \r\n

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文