使用正则表达式替换 Pre 标记内的 Html

Posted

技术标签:

【中文标题】使用正则表达式替换 Pre 标记内的 Html【英文标题】:Replace Html inside Pre tag using Regex 【发布时间】:2011-06-28 07:48:08 【问题描述】:

如何替换 pre 标签中的 html?我更愿意用正则表达式来做到这一点

<html>
<head></head>
<body>
<div>
<pre>

    <html>
    <body>
    -----> hello! ----< 
    </body>
    </html

</pre>
</div>
</body>

【问题讨论】:

不知何故,这听起来是个坏主意。如果有人能说出这个问题的真正含义。 对于初学者来说,这甚至看起来都不是有效的 HTML。 您没有说明结果应该是什么样子或输入是什么样子(您的临时样​​本可能无法反映现实),它来自哪里以及为什么要使用正则表达式。在这种形式下,这几乎不是问题。 我同意.. 有什么问题?您想更改
中的文本?
您最好告诉我们更多背景知识,以便我们提供一个体面的解决方案 【参考方案1】:

RegEx match open tags except XHTML self-contained tags

谢谢马蒂尼奥·费尔南德斯

【讨论】:

【参考方案2】:

编辑: 正如另一个答案所示,正则表达式不完全支持 HTML 或 XHTML,因此最好使用 HTML 解析器。不过,我将把答案留在这里以供参考。

你想用什么替换前置标签中的内容?

我不熟悉特定的 C# 语法,但如果 C# 使用 Perl 样式的正则表达式,以下 php-sn-p 可能会有所帮助。下面的代码会用字符串“(pre tag content was here)”替换pre-tags里面的内容(刚刚用命令行PHP客户端测试过):

<?php
$html = "<html><head></head><body><div><pre class=\"some-css-class\">
         <html><body>
         -----> hello! ----< 
         </body></html
         </pre></div></body>"; // Compacting things here, for brevity

$newHTML = preg_replace("/(.*?)<pre[^<>]*>(.*?)<\/pre>(.*)/Us", "$1(pre tag content was here)$3", $html);
echo $newHTML;
?>

? 标记是为了使匹配不贪婪(在第一次出现之后停止),mU modifiers 指定“Unicode-character-support”和“single-line support” .后者对于使 . 匹配换行符也很重要。 [^&lt;&gt;]*部分用于支持pre标签中的属性,例如&lt;pre class="some-css-class"&gt;(它将匹配除&lt;&gt;之外的任意数量的字符。

更新:如以下 cmets 中的 Martinho Fernandes 所示,上述正则表达式的 C# 语法应类似于:

new Regex(@"(.*?)<pre[^<>]*>(.*?)<\/pre>(.*)", RegexOptions.SingleLine)

【讨论】:

为示例工作。 &lt;pre class="fail"&gt;foo&lt;/pre&gt; 失败。不过,不知道这对 OP 是否重要。 啊,真的。将修改我的答案。 @Marthinho & Samuel:简单地删除
 和 \
@Levisaxos:没错,这会起作用,但会有点明确(如果任何其他标签以“pre”开头)。使用允许在 pre 标记中包含任意数量的非 字符的解决方案进行了更新。 &lt;pre crazy=""&lt;/pre&gt;FAIL""&gt;&lt;!-- &lt;/pre&gt; Fail AGAIN! --&gt;&lt;/pre&gt;。说真的,stop trying.

以上是关于使用正则表达式替换 Pre 标记内的 Html的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式替换 Notepad++ 中标签之间的文本

PHP 正则表达式匹配 img ,PHP 正则提取或替换图片 img 标记中的任意属性。

正则表达式替换以删除 html 标记之间的空格

如何使用 PL/SQL 正则表达式将 HTML 标记及其内容替换为相同数量的“?s”?

替换此 HTML 标记的 preg_replace 正则表达式是啥?

正则表达式用于匹配 img 标记的开始和结束尖括号内的所有文本