Посоветуйте чистилку для кода

dvserzhantov

Здравствуйте!

Нужна хорошая чистилка для кода HTML, чтобы оставались только теги и контент, а стили и свойства удалялись.

2 ответа

dvserzhantov

Обратите внимание на HTML Purifier

HTML Purifier не только удаляет все вредоносные коды (более известные как XSS) ... он также удостоверится, что ваши документы соответствуют стандартам.


dvserzhantov

чистит HTML по заданным regexp паттернам. у программы в качестве параметров пути к 3м файлам (см. ниже). файл с regexp, состоит из отдельных пар regexp + замена через ";". если надо просто удалить то после ";" ничего добавлять ненадо:

\n;
style=\".*\";style="my own style"
class=\".*\";class="my own class"
> *<;><

входной файл:

<h2 style="background-color:red;">This is a heading</h2>
 <p class="background-color:green;">This is a paragraph.</p>
 <p>             </p>

файл с результатом :

<h2 style="my own style">This is a heading</h2><p class="my own class">This is a paragraph.</p>

исходный код java (если не знаете что с этим делать, google: java запуск приложения), FilterHtml.java:

import java.io.BufferedReader ;
import java.io.BufferedWriter ;
import java.io.File ;
import java.io.FileNotFoundException ;
import java.io.FileReader ;
import java.io.FileWriter ;
import java.io.IOException ;
import java.util.Arrays ;
import java.util.HashMap ;
import java.util.Map ;
import java.util.Map.Entry ;

public class FilterHtml
{
    public static void main ( final String[] args )
    {
        if ( null == args || 3 != args.length )
        {
            System.out.println ( Arrays.toString ( args ) ) ;
            usage () ;
        }
        else
        {
            process ( args[0], args[1], args[2] ) ;
        }
    }

    private static void usage ()
    {
        System.out.println ( "Module usage: <module>  <output> <pattern>" ) ;
        System.out.println ( "\t" ) ;
        System.out.println ( "\t\t - input file" ) ;
        System.out.println ( "\t\t<output> - output file" ) ;
        System.out.println ( "\t\t<pattern> - pattern file" ) ;
    }

    public static void process ( final String input, final String output, final String filter )
    {
        // create fso
        final File src = new File ( input ) ;
        final File dest = new File ( output ) ;
        final File pattern = new File ( filter ) ;

        // validate input
        if ( src.isFile () && !src.exists () )
        {
            throw new IllegalArgumentException ( "input file do not exist" ) ;
        }
        if ( dest.exists () )
        {
            if ( dest.isDirectory () )
            {
                throw new IllegalArgumentException ( "output file is a directory" ) ;
            }

            dest.delete () ;
        }
        if ( !pattern.exists () )
        {
            throw new IllegalArgumentException ( "pattern file do not exist" ) ;
        }
        if ( !pattern.isFile () )
        {
            throw new IllegalArgumentException ( "pattern file is not a file" ) ;
        }

        // read patterns
        final Map < String, String > patterns = readPatterns ( pattern ) ;
        if ( null == patterns )
        {
            throw new IllegalArgumentException ( "invalid pattern file" ) ;
        }

        // read input file
        final StringBuilder in = readInput ( src ) ;

        System.out.println ( "--- before ---\n" + in ) ;

        // prepare output
        String out = new String ( in ) ;

        // apply each pattern
        String p, r ;

        for ( final Entry < String, String > e : patterns.entrySet () )
        {
            // get pattern
            p = e.getKey () ;

            // get replacement
            r = e.getValue () ;

            // replace
            out = out.replaceAll ( p, r ) ;
        }

        System.out.println ( "--- after ---\n" + out ) ;

        writeOutput ( dest, out ) ;
    }

    private static void writeOutput ( final File file, final String out )
    {
        try
        {
            final BufferedWriter w = new BufferedWriter ( new FileWriter ( file ) ) ;
            w.write ( out ) ;
            w.close () ;
        }
        catch ( final FileNotFoundException e )
        {
            System.out.println ( "failed write output file: " + e.getLocalizedMessage () ) ;
            e.printStackTrace () ;
        }
        catch ( final IOException e )
        {
            System.out.println ( "failed write output file: " + e.getLocalizedMessage () ) ;
            e.printStackTrace () ;
        }
    }

    private static StringBuilder readInput ( final File src )
    {
        final StringBuilder result = new StringBuilder () ;
        try
        {
            final BufferedReader r = new BufferedReader ( new FileReader ( src ) ) ;
            String line = null ;
            while ( null != (line = r.readLine ()) )
            {
                result.append ( line ).append ( '\n' ) ;
            }
            r.close () ;
        }
        catch ( final FileNotFoundException e )
        {
            System.out.println ( "failed read input file: " + e.getLocalizedMessage () ) ;
            e.printStackTrace () ;
            return null ;
        }
        catch ( final IOException e )
        {
            System.out.println ( "failed read input file: " + e.getLocalizedMessage () ) ;
            e.printStackTrace () ;
            return null ;
        }

        return result ;
    }

    private static Map < String, String > readPatterns ( final File pattern )
    {
        final Map < String, String > patterns = new HashMap < String, String > () ;

        try
        {
            final BufferedReader r = new BufferedReader ( new FileReader ( pattern ) ) ;
            String line = null ;
            while ( null != (line = r.readLine ()) )
            {
                if ( line.isEmpty () || !line.contains ( ";" ) )
                {
                    continue ;
                }
                patterns.put ( line.substring ( 0, line.lastIndexOf ( ';' ) ),
                        line.substring ( line.lastIndexOf ( ';' ) + 1 ) ) ;
            }
            r.close () ;

            return patterns ;
        }
        catch ( final FileNotFoundException e )
        {
            System.out.println ( "failed read pattern file: " + e.getLocalizedMessage () ) ;
            e.printStackTrace () ;
            return null ;
        }
        catch ( final IOException e )
        {
            System.out.println ( "failed read pattern file: " + e.getLocalizedMessage () ) ;
            e.printStackTrace () ;
            return null ;
        }
    }
}
</pattern></output></pattern></output></module>

licensed under cc by-sa 3.0 with attribution.