0

我需要去掉<p>pre 标签内的标签,我该如何在 php 中做到这一点?我的代码将是这样的:

<pre class="brush:php;">
<p>Guna</p><p>Sekar</p>
</pre>

我需要标签内的文本<p>,只需要删除<p> </p>标签。

4

5 回答 5

1

这可以用一个正则表达式来完成,这在 powershell 中进行了测试,但应该适用于大多数支持环视的正则表达式

$string = '<pre class="brush:php;"><p>Guna</p><p>Sekar</p></pre><pre class="brush:php;"><p>Point</p><p>Miner</p></pre>'
$String -replace '(?<=<pre.*?>[^>]*?)(?!</pre)(<p>|</p>)(?=.*?</pre)', ""

产量

<pre class="brush:php;">GunaSekar</pre><pre class="brush:php;">PointMiner</pre>

剖析正则表达式:

  1. 第一个前瞻验证在当前匹配之前有一个 pre 标签
  2. 第二个环视验证在 pre 标记和匹配项之间没有 /pre 标记
  3. 测试 p 和 /p
  4. 环顾四周以确保有一个结束 /pre 标记
于 2013-04-28T17:57:33.680 回答
0

您可以使用基本的正则表达式。

<?php
$str = <<<STR
<pre class="brush:php;">
<p>Guna</p><p>Sekar</p>
</pre>
STR;
echo preg_replace("/<[ ]*p( [^>]*)?>|<\/[ ]*p[ ]*>/i", " ", $str);
于 2013-04-28T16:23:27.113 回答
0

您可以使用preg_replace_callback()匹配<pre>标签中的所有内容,然后使用strip_tags()删除所有 html 标签:

$html = '<pre class="brush:php;">
<p>Guna</p><p>Sekar</p>
</pre>
';

$removed_tags = preg_replace_callback('#(<pre[^>]*>)(.+?)(</pre>)#is', function($m){
    return($m[1].strip_tags($m[2]).$m[3]);
}, $html);
var_dump($removed_tags);

请注意,这只适用于 PHP 5.3+

于 2013-04-28T17:18:11.637 回答
0

你可以试试下面的代码。它运行 2 个正则表达式命令来列出 <pre> 标签内的所有 <p> 标签。

preg_match('/<pre .*?>(.*?)<\/pre>/s', $string, $matches1);
preg_match_all('/<p>.*?<\/p>/', $matches1[1], $ptags);

匹配的 <p> 标签将在 $ptags 数组中可用。

于 2013-04-28T16:45:44.787 回答
0

这看起来很简单,但要花几个小时才能找到方法。这就是我所做的:

  • 从源代码 forge 下载了简单的 dom 解析器
  • 遍历每个<pre>标签并剥离<p>标签
  • 将内容重写为<pre>标签
  • 检索修改的内容

这是完整的代码:

include_once 'simple_html_dom.php';
$text='<pre class="brush:php;"><p>Guna</p><p>Sekar</p></pre>';
$html = str_get_html($text);
$strip_chars=array('<p>','</p>');
foreach($html->find('pre') as $element){
  $code = $element->getAttribute('innertext');
  $code=str_replace($strip_chars,'',$code);
  $element->setAttribute('innertext',$code);
}
echo $html->root->innertext();

这将输出:

<pre class="brush:php;">GunaSekar</pre>  

感谢您的所有建议。

于 2013-06-29T13:03:22.873 回答