将<code></code>之间的HTML标记转换为特殊字符

时间:2014-07-22 05:45:05

标签: php regex htmlspecialchars

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

我使用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函数,因为我需要那些例如要呈现的标题和代码块。实际上我只需要转换之间的所有特殊字符 <code></code>

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

  1. 仅在<之间匹配所有></<code></code>,并在特殊字符上使用preg_replace()每一个。

  2. 匹配每个<code></code>之间的所有字符(因为我会在每篇文章中包含多个代码块),然后将preg_replace()htmlspecialchars()

  3. 一起使用

    请告知

    1. 我应该选择哪种选择?
    2. RegEx是做什么工作的?
    3. P.S。

      我将来自markdown的HTML结果放在regex101.com我尝试了一些RegEx,例如选择1 (?<=<code>)[<](?=<\/code>)/g,选择2 (?<=<code>)[\s\S]*(?=<\/code>)/g,但它们都不起作用。

      被修改

      这是我希望的预期结果。

          <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>
      

3 个答案:

答案 0 :(得分:3)

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

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

Working Demo

答案 1 :(得分:1)

以下正则表达式将匹配<code></code>标记内的所有字符

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

DEMO

答案 2 :(得分:0)

你在Markdown写你的帖子,对吗? Markdown支持code blocks。使用它们。

如果要包含代码段,请将其缩进四个空格 - 就像在StackOverflow上一样 - 并且Markdown将生成<code>元素并自动转义其中的任何尖括号和&符号。您不必对自己进行任何后处理,以确定HTML的哪一部分属于代码段,因为Markdown已经知道了。

基本上,就像你在上面的问题中编写HTML一样。这是Markdown。