去掉另一个标签内的<p>标签</p>

时间:2013-04-28 16:16:37

标签: php regex preg-replace

我需要删除pre标签内的<p>标签,我该如何在php中执行此操作?我的代码将是这样的:

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

我需要<p>个代码中的文字,只需删除<p> </p>代码。

5 个答案:

答案 0 :(得分:0)

您可以使用基本的Regexp。

<?php
$str = <<<STR
<pre class="brush:php;">
<p>Guna</p><p>Sekar</p>
</pre>
STR;
echo preg_replace("/<[ ]*p( [^>]*)?>|<\/[ ]*p[ ]*>/i", " ", $str);

答案 1 :(得分:0)

您可以尝试以下代码。它运行2个正则表达式命令来列出所有&lt; p&gt;标签内&lt; pre&gt;标签

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

匹配&lt; p&gt;标签将以$ ptags数组的形式提供。

答案 2 :(得分: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 +

答案 3 :(得分:0)

这可以通过一个正则表达式完成,这是在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. 第一个预测验证当前匹配前有一个预标记
  2. 第二个环视验证了pre标记与匹配之间没有/ pre标记
  3. 测试p和/ p
  4. 环顾四周以确保有关闭/预标记

答案 4 :(得分:0)

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

  • 从source forge下载simple dom parser
  • 遍历每个<pre>代码并删除<p>代码
  • 将内容重写为<pre>代码
  • Retrive modified content

以下是完整代码:

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>  

感谢你的所有建议。