gpt4 book ai didi

php - 如何用 PHP 替换\r\n 外部
 标签,而不是内部

转载 作者:可可西里 更新时间:2023-10-31 23:38:52 25 4
gpt4 key购买 nike

例如我有字符串:

This is text outside \r \n of pre tags 
<pre class="myclass"> Text inside \r \n pre tags</pre>
This is text \r \n \r\n outside of pre tags

任何人都可以帮我如何替换和删除\r\n,但只能在 <pre> 之外标签,(<pre class="myclass"></pre> 的内容不会被替换)?如何使用 php 正则表达式和 preg_replace() 或其他方式来实现?

我在 var $text = 'text<pre class="myclass">text</pre>text'; 中有文字

非常感谢您的帮助

更新: 感谢大家的回复,对我很有帮助,我会考虑 DOM,我已经用 preg_split() 尝试过,似乎它可以满足我的需要,也许对某些人有帮助 - 在 <pre class="myclass"></pre> 之外替换\r\n标签:

 function ReplaceOutsidePreTags($text) {
$parts = preg_split('/(\<pre class="myclass"\>.+?\<\/pre\>)/s',$text,-1,PREG_SPLIT_DELIM_CAPTURE);
$text_new = '';
foreach ($parts as $key=>$value) {
if (preg_match('[<pre class="myclass">|</pre>]',$value) == true) {
$text_new .= $value;
} else {
$text_new .= str_replace(array("\\r\\n","\\n","\\r"),array("","",""), $value);
}
}
return $text_new;
}

$text = 'this is text\r\n\r\r\n\n outside pre tag\r\n
<pre class="myclass">graphics,\r\n\r\nprogramming </pre>
this is text outside\r\n pre tag\r\n
<pre class="myclass">graphics,\r\n\r\nprogramming </pre>
this is text outside\r\n pre tag\r\n
<pre class="myclass">graphics,\r\n\r\nprogramming </pre>
this is text outside pre tag\r\n';


$text_new = $this->ReplaceOutsidePreTags($text);
echo $text_new;

结果>

this is text outside pre tag 
<pre class="myclass">graphics,\r\n\r\nprogramming </pre>
this is text outside pre tag
<pre class="myclass">graphics,\r\n\r\nprogramming </pre>
this is text outside pre tag
<pre class="myclass">graphics,\r\n\r\nprogramming </pre>
this is text outside pre tag

最佳答案

通用“替换内容,但不替换其他内容”解决方案:

$out = preg_replace("(<pre(?:\s+\w+(?:=\w+|\"[^\"]+\"|'[^']+')?)*>.*?</pre>(*SKIP)(*FAIL)"
."|\r|\n)is", "", $in);

匹配<pre>标签(带有属性,可能是 bool 值、未引号、单引号或双引号,因为 HTML 没有反斜杠转义以使事情复杂化),然后跳过并使它们失败。然后匹配换行符并用空字符串替换它们。

然而,作为更一般的规则,请考虑研究 DOM 解析系统,例如 DOMDocument。遍历节点,忽略 <pre>标记并从剩余的文本节点中删除换行符。

我实际上使用与上述类似的正则表达式来保留重要位置的空白并将其从其他位置删除,但我使用 <!-- WSP_BEGIN --> ... <!-- WSP_END -->标记来绕过 HTML 解析的丑陋之处 - 因为用户提供的内容是 HTML 转义的,所以它不会与评论冲突,所以没有问题。

编辑:作为引用,这里是我正在使用的代码,它通过去除不必要的空格每天单独为我节省兆字节到千兆字节的带宽。我将其称为“预压缩空白”:

$c = preg_replace_callback(
"(<!-- WSP_BEGIN -->(.*?)<!-- WSP_END -->|\r|\n|\t)",
function($m) {
if( $m[1]) return $m[1]; // effectively strips markers
else return " "; // condense whitespace
},
$c
);

关于php - 如何用 PHP 替换\r\n 外部 <pre> 标签,而不是内部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32964843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com