【问题标题】:PHP - encode everything inside tag <code>PHP - 对标签 <code> 内的所有内容进行编码
【发布时间】:2018-05-14 17:29:17
【问题描述】:

我只想让我的博客尽可能地易于编码。 我的问题是:

如何(如果可能的话)通过htmlentities();对HTML标签&lt;code&gt;中的所有内容进行编码

我想要这个: 如果我发了一个关于制作东西的帖子,我不需要通过一些在线编码器对其进行编码,而只需制作类似的东西

"Just simply put
<code>
encoded code
</code>
and this <b>bold</b> text will be bold, because it isn't inside <code>

是否有可能在 php 代码中使用一些曾经像这样的函数

encode_tags($text,"<code>","</code>");

?

【问题讨论】:

  • 使用 HTML 解析器并有选择地对部分进行编码。
  • @tadman 我是选择性编码部分的新手。我不知道该怎么做。这就像一个问题。
  • 第一步应该访问Composer,看看有什么工具可以解决这个问题。那里有大量的 HTML 解析器,有些易于使用,有些更灵活,您可以从中挑选。重要的是要知道你有哪些选项,因为在 PHP 世界中通常有很多选项。
  • @tadman 你有任何首选的解析器吗?我将尝试使用下载次数最多的一个。不过谢谢你的回答。
  • 您不能真正为此使用 HTML 解析器:目标是 &lt;code&gt; 标记的内容作为 HTML 进行解析。 (基本上是输入中断,处理起来总是一场噩梦,需要大量的启发式方法)。

标签: php html encode


【解决方案1】:

您的输入字符串(稍作编辑以澄清我的答案):

$string = "Just simply put
<code>
<p>encoded code</p>
</code>
and this <b>bold</b> text will be bold, 
because it isn't inside <code><b>code tags</b></code>";

第 1 步:
将您的字符串分成由&lt;code&gt; 包围的部分。请注意,您的正则表达式应使用# 而不是/ 作为分隔符,因此您无需关心&lt;/code&gt; 中的/

 preg_match_all("#<code>(.*?)</code>#is", $string, $codes);

注意 REGEX 末尾的 s 以忽略组 (*) 上的换行符。

上面的代码是惰性的(见底部的链接)并且也将匹配不完整的标签(例如&lt;code&gt;没有对应的&lt;/code&gt;)。

第 2 步:
根据需要对找到的每个子字符串进行 HTML 更改(您应该熟悉 preg_match_all 如何从函数返回数据,请参阅底部的链接):

$replace = [];
foreach($codes[1] as $key=>$codeBlock ){
    $replace[$key] = htmlentities($codeBlock, ENT_QUOTES, "UTF-8", false);
}
unset($key, $codeBlock);

第 3 步:
将更改应用于原始值(这些值与第 2 步中使用的转换值相同):

foreach($codes[0] as $key=>$replacer){
    $string = str_replace($replacer, $replace[$key], $string);
}
unset($key, $replacer, $replace);

输出:

上面会输出:

简单地说

编码

并且这个 bold 文本将是粗体,因为它不在 代码标签


您应该熟悉preg_match_* 系列PHP 函数以及一般的PCRE REGEX

还请阅读this herehereread this,尤其是this

干杯

【讨论】:

  • @DanB。当然;只需将第二个 foreach $codes[0] 替换为 $codes[1]。我的答案旁边的上升也很好,谢谢;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多