处理HTML块,忽略特定标记内的内容

Dar*_*ton 1 php regex

在博客上,我希望通过PHP脚本传递博客条目的所有文本,以便将引号和其他一些项目处理成漂亮的印刷字符.

有问题的博客文本包含HTML,特别是将突出显示<pre><code> ... </code></pre>块中包含的代码片段.这些code块可以随机出现在文本中的多个位置(很像Stack Overflow!)

我不希望那些由我将使用的排版脚本处理的代码块. 处理本身不是重点,能够有选择地应用它.

我已经能够写一个正则表达式来找到这些块:

preg_match_all('/(<pre><code>(.*?)<\/code><\/pre>)/s', $text, $matches);
Run Code Online (Sandbox Code Playgroud)

但我不确定最好的方法是处理文本的其余部分,然后将这些块插回正确的位置.

谢谢你的帮助!

Pas*_*TIN 5

我想到的第一个解决方案如下:

  • 提取所有代码
  • 删除代码,用特殊标记替换它们,不受字符串操作的影响 - 该标记必须非常特殊(并且您可以验证它在输入字符串中不存在,顺便说一句)
  • 对字符串进行操作
  • 把代码放回去,现在有标记

在代码中,它可能是这样的:( 对不起,它很长 - 我没有包括任何检查;这取决于你添加那些)

$str = <<<A
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sodales lacus et erat accumsan consectetur. Sed lacinia enim vitae erat suscipit fermentum. Quisque lobortis nisi et lacus imperdiet ac malesuada dui imperdiet. <pre><code>ThIs Is 
CoDe 1</code></pre>Donec vestibulum commodo quam rhoncus luctus. Nam vitae ipsum sed nibh dignissim condimentum. Sed ultrices fermentum dapibus. Vivamus mattis nisi nec enim convallis quis aliquet arcu accumsan. Suspendisse potenti. Nullam eget fringilla nunc. Nulla porta justo justo. Nunc consectetur egestas malesuada. Mauris ac nisi ipsum, et accumsan lorem. Quisque interdum accumsan pellentesque. Sed at felis metus. Nulla gravida tincidunt tortor, <pre><code>AnD cOdE 2</code></pre>nec aliquam tortor ultricies vel. Integer semper libero eu magna congue eget lacinia purus auctor. Nunc volutpat ultricies feugiat. Nullam id mauris eget ipsum ultricies ullamcorper non vel risus. Proin volutpat volutpat interdum. Nulla orci odio, ornare sit amet ullamcorper non, condimentum sagittis libero. <pre><code>aNd
CoDe
NuMbEr 3
</code></pre>Ut non justo at neque convallis luctus ultricies amet. 
A;
var_dump($str);

// Extract the codes
$matches = array();
preg_match_all('#<pre><code>(.*?)</code></pre>#s', $str, $matches);
var_dump($matches);

// Remove the codes
$str_nocode = preg_replace('#<pre><code>.*?</code></pre>#s', 'THIS_IS_A_NOCODE_MARKER', $str);
var_dump($str_nocode);

// Do whaterver you want with $str_nocode
$str_nocode = strtoupper($str_nocode);
var_dump($str_nocode);

// And put back the codes :
$str_codes = $str_nocode;
foreach ($matches[0] as $code) {
    $str_codes = preg_replace('#THIS_IS_A_NOCODE_MARKER#', $code, $str_codes, 1);
}
var_dump($str_codes);
Run Code Online (Sandbox Code Playgroud)

我尝试过:

  • 代码在一行上,
  • 代码在2行,
  • 和多行代码

注意:你应该比我做的更多 - 但这可能会给你第一个想法......

希望这可以帮助 :-)

作为旁注:一般来说,使用正则表达式解析HTML被认为是不好的做法,并且经常导致麻烦...也许使用类似的东西DOMDocument::loadHTML可能是值得一看的想法?