【问题标题】:Covert HTML tags between <code></code> to special characters将 <code></code> 之间的 HTML 标记转换为特殊字符
【发布时间】:2014-07-22 05:45:05
【问题描述】:

我正在使用 PHP 编写博客网络应用程序,我希望博客能够向观众展示一些代码 sn-ps

我使用 Markdown 文件将新文章发布到博客,所以在从 Markdown 转换为 HTML 后,结果应该是这样的

<h3>This is sample HTML Coding</h3>

<pre><code>
    <html>
        <body>
            Hello World
        </body>
    </html>
</code></pre>

<h3>This is another sample HTML Coding</h3>

<pre><code>
    <html>
        <body>
            Another Hello World
        </body>
    </html>
</code></pre>

我不能简单地使用像 htmlspecialchars() 这样的 PHP 函数,因为我需要这些函数,例如要呈现的标题和代码块。事实上,我应该只需要转换 &lt;code&gt;&lt;/code&gt;

之间的所有特殊字符

现在我唯一能想到的就是使用 RegEx,我想出了 2 个方向选择,我认为这是可能的。

  1. 仅在&lt;code&gt;&lt;/code&gt;之间匹配所有&lt;&gt;&lt;/,并在每个preg_replace()上使用特殊字符

    李>
  2. 匹配每个&lt;code&gt;&lt;/code&gt; 之间的所有字符(因为我会在每篇文章中使用多个代码块)然后使用preg_replace()htmlspecialchars()

请指教

  1. 我应该使用哪个选项?
  2. 什么是正则表达式来完成这项工作?

附言

我将 Markdown 的 HTML 结果放在regex101.com 我尝试了一些正则表达式,例如(?&lt;=&lt;code&gt;)[&lt;](?=&lt;\/code&gt;)/g 用于选项 1,(?&lt;=&lt;code&gt;)[\s\S]*(?=&lt;\/code&gt;)/g 用于选项 2,但它们都不起作用。

已编辑

这是我希望的结果。

    <h3>This is sample HTML Coding</h3>

    <pre><code>
        &lt;html>
            &lt;body&gt;
                Hello World
            &lt;/body&gt;
        &lt;/html&gt;
    </code></pre>

    <h3>This is another sample HTML Coding</h3>

    <pre><code>
        &lt;html&gt;
            &lt;body&gt;
                Another Hello World
            &lt;/body&gt;
        &lt;/html&gt;
    </code></pre>

【问题讨论】:

  • 上述 html 代码的预期输出是什么?
  • 我在编辑部分写了预期的结果,谢谢。
  • @Wyzard,我正在使用 Fat-Free 框架的内置 markdown,我得到了与给定示例一样的转换结果。

标签: php regex htmlspecialchars


【解决方案1】:

我不清楚你为什么要这样做,但你应该在这里使用回调函数:

$html = preg_replace_callback('~(?<=<code>).*?(?=</code>)~s', 
      function($m) {
         return htmlentities($m[0]);
      }, $html);

Working Demo

【讨论】:

  • 我仍然对您的 RegEx 感到困惑(尤其是 ~ 而不是 /),因为它在 regex tester 中不起作用,但是当将所有内容放在 PHP 中时就像魔术一样工作,但是其他给定的答案,例如 (?&lt;=&lt;code&gt;).*?(?=&lt;\/code&gt;)Demoregex tester 中工作,但我真的不知道如何将它与 PHP 结合起来,请你解释一下更多或给我一些链接,我可以了解更多信息。
  • ~ 是一个分隔符。请参阅 PHP 分隔符。
【解决方案2】:

下面的正则表达式将匹配 &lt;code&gt;&lt;/code&gt; 标签内的所有字符,

(?s)(?<=<code>).*?(?=<\/code>)

DEMO

【讨论】:

  • 那么只有s 就足够了。
  • 如果我在文章中有 2 个代码块,就像给出的示例一样,我是否必须循环 2 次才能使用 preg_replace()?我的意思是,我不太了解实际过程。
  • 除非代码 sn -p 包含 &lt;code&gt;...&lt;/code&gt; 元素...
【解决方案3】:

你是用 Markdown 写文章的,对吧? Markdown 支持code blocks。使用它们。

当你想要包含一个代码 sn-p 时,将它缩进四个空格——就像你在 StackOverflow 上所做的那样——Markdown 将生成一个 &lt;code&gt; 元素并自动转义其中的任何尖括号和 & 符号。您不必自己进行任何后处理来确定 HTML 的哪一部分属于代码 sn-p,因为 Markdown 已经知道了。

基本上,只需执行与上述问题中编写 HTML 相同的操作即可。这就是 Markdown。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2010-10-21
    • 2017-07-04
    相关资源
    最近更新 更多