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

标签 php regex

例如我有字符串:

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/

相关文章:

php - 如何将 eval() 与命名空间代码一起使用?

PHP MySQL : COUNT/SUM a non integer column with different values

regex - BigQuery Regexp 中的前瞻

Beautiful Soup 的 Python 正则表达式

javascript - 如何从来自服务器的日期中以 dd/mm/yyyy 格式仅提取月份和年份(作为字符串)并将其存储在变量中?

php - 如何在 braintree 服务器 php iOS 上更新信用卡信息?

PHP 正则表达式 关键词匹配

php - 用 Laravel 编写的站点事件时间线的数据库结构

javascript - 匹配时间的正则表达式模式,如 '1h 10m'

正则表达式模式任意两个字母后跟六个数字