正则表达式删除(排除)字符串

时间:2015-12-30 21:25:42

标签: php regex

我尝试删除在特定字符串之前显示的input标记。我有一个巨大的字符串,由一个表单/ table / tr / td /输入组成,超过100个。这是以下示例html:

<input type="hidden" name="special" value="123">
...
<tr>
  <td> 
    <input type="checkbox" name="extendedeventinfo76022" value="y"> Enable Search
  </td>
</tr>

<tr>
  <td> 
    <input type="checkbox" name="extendedeventinfo76006" value="y"> Enable Display 
  </td>
</tr>

<tr>
  <td> 
    <input type="checkbox" name="extendedeventinfo76137" checked value="y"> Enable Notes
  </td>
</tr>
...

我想说我要删除Enable Display的输入标记。到目前为止,我可以选择启用显示, ^(.*?(\bEnable Display\b)[^$]*)$ 但我不确定如何转到上一个标记<input...>并删除它(或者更好的是,选择整个文档,但不包括那些输入)。

我还有单独的 input标记,我必须根据name属性删除这些标记。所以基本上,正则表达式将给出以下输出:

...
<tr>
  <td> 
    <input type="checkbox" name="extendedeventinfo76022" value="y"> Enable Search
  </td>
</tr>

<tr>
  <td> 
     Enable Display 
  </td>
</tr>

<tr>
  <td> 
    <input type="checkbox" name="extendedeventinfo76137" checked value="y"> Enable Notes
  </td>
</tr>
...

正如您所看到的,第一个隐藏的输入名称为&#34; special&#34;和#34;启用显示&#34;旁边的输入一样消失了。

2 个答案:

答案 0 :(得分:0)

设计单个正则表达式以一次性实现您想要的效果,并不是一件容易的事情,并且执行起来会很慢。

您可能想要考虑替代方法 - 循环遍历行/标记(可能使用XML / HTML PHP解析器之一)并根据您的标准构建所需的输出。

答案 1 :(得分:0)

#!/usr/bin/php
<?php 
$string = <<<'EOT'
<input type="hidden" name="special" value="123">
...
<tr>
  <td> 
    <input type="checkbox" name="extendedeventinfo76022" value="y"> Enable Search
  </td>
</tr>

<tr>
  <td> 
    <input type="checkbox" name="extendedeventinfo76006" value="y"> Enable Display 
  </td>
</tr>

<tr>
  <td> 
    <input type="checkbox" name="extendedeventinfo76137" checked value="y"> Enable Notes
  </td>
</tr>
...

EOT;
echo preg_replace('/<input .* name="special" .*>|
                    <input .*>(?=\ Enable\ Display)/x', '', $string);