剥离不在[code] [/ code]段中的标签

时间:2009-09-24 16:04:02

标签: php regex

我正试图找到一种从用户输入的字符串中删除标记的方法,除了包含在[code] [/ code] BB样式标记中的标记。

例如,用户可以输入:

<script>alert("hacked");</script>
[code]<script>alert("hello");</script>[/code]

我想要删除的“黑客”警报,而不是“Hello”警报。

我想删除[code]之外的所有标签(php,html,css,js),但允许其中的任何内容。

到目前为止,我已经得到了以下代码来反转我想要的内容:

preg_replace('/\[code\](.*?)\[\/code\]/ise','strip_tags(\'$1\')',$code)

4 个答案:

答案 0 :(得分:3)

我不确定这是否是最好的算法,但这是一个想法。

  1. 将所有[code]块移除到数组
  2. 从剩余字符串中删除标记
  3. 重新插入以前删除的[code]块。
  4. 瞧!
  5. 这是对那个算法的抨击

    <?php
    
    header( 'Content-Type: text/plain' );
    
    $input = <<<BB
    [code]<script>alert("hello");</script>[/code]
    some text <script>alert("hacked");</script> some other text
    [code]<script>alert("hello");</script>[/code]
    some text <script>alert("hacked");</script> some other text
    [code]<script>alert("hello");</script>[/code]
    BB;
    
    echo strip_custom( $input );
    
    function strip_custom( $content )
    {
      $pattern = "#\\[code].*?\\[/code]#i";
    
      if ( preg_match_all( $pattern, $content, $codeBlocks ) )
      {
        return array_join( $codeBlocks[0], array_map( 'strip_tags', preg_split( $pattern, $content ) ) );
      }
      return strip_tags( $content );
    }
    
    function array_join( array $glue, array $pieces )
    {
      $glue       = array_values( $glue );
      $pieces     = array_values( $pieces );
      $piecesSize = count( $pieces );
    
      if ( count( $glue ) + 1 != $piecesSize )
      {
        return false;
      }
    
      $joined = array();
      for ( $i = 0; $i < $piecesSize; $i++ )
      {
        $joined[] = $pieces[$i];
        if ( isset( $glue[$i] ) )
        {
          $joined[] = $glue[$i];
        }
      }
      return implode( '', $joined );
    }
    

答案 1 :(得分:1)

这是正则表达式不理想的地方。当你知道“你想要什么”而不是“你不想想要什么”时,正则表达式是极好的。我的建议是你试图找到另一种做同样事情的方法,但没有正则表达式。

答案 2 :(得分:0)

您希望将HTML Parser用于此作业。

我不知道PHP,但谷歌发现了HTML Parser for PHP

答案 3 :(得分:0)

使用这样的简单解析器:

stack-pointer = 0
while not finished:
    stack-pointer-n = code-start-matched or endl
    tag-free-str = regex-magic-to-strip-tags(extract-str(stack-pointer, stack-pointer-n))
    preserve-str = extract-str(stack-pointer-n, code-endl-matched or endl)
    stack-pointer = code-endl-matched + 1
    push(tag-free-str)
    push(preserve-str)