2010-06-16 34 views
19

Làm cách nào để tìm xem chuỗi có chứa dữ liệu HTML hay không? Người dùng cung cấp đầu vào thông qua giao diện web và rất có thể anh ta có thể đã sử dụng văn bản đơn giản hoặc định dạng HTML được sử dụng.Cách tìm chuỗi có chứa dữ liệu html không?

+0

Có thể trùng lặp của [Cách xác thực chuỗi không chứa HTML bằng C#] (http://stackoverflow.com/questions/204646/how-to- validate-that-a-string-doesnt-contains-html-using-c-sharp) – nullpointer

+0

OP muốn làm điều đó trong Java, đây là bản sao như thế nào? –

Trả lời

4

Bạn có thể sử dụng cụm từ thông dụng để tìm kiếm thẻ HTML.

+0

Ah, vấn đề cũ tốt # 2. Tom là đúng, regex là cách trực tiếp nhất để hoàn thành công việc và thường có rất nhiều ví dụ trực tuyến để giúp bạn tiếp tục. –

+0

@Alex Larzelere: vấn đề # 2? Bạn có thể giải thích? Đây có phải là một tham chiếu xkcd ("bây giờ bạn đã có hai vấn đề"), hoặc cái gì khác? – CPerkins

+0

@ Bí quyết chính xác. Ol '# 2, vấn đề # 1 tất nhiên là bất cứ điều gì bạn đang cố gắng làm ban đầu. –

2

Trong đậu ủng hộ của bạn, bạn có thể thử để tìm thẻ html như <b> hay <i>, vv ... Bạn có thể sử dụng biểu thức thông thường (chậm) hoặc chỉ cố gắng tìm ra "<>" chars. Nó phụ thuộc vào cách chắc chắn bạn muốn được rằng người dùng sử dụng html hay không.

Hãy nhớ rằng người dùng có thể viết <asdf>. Nếu bạn muốn chắc chắn 100% rằng html được sử dụng là hợp lệ, bạn sẽ cần phải sử dụng một trình phân tích cú pháp html phức tạp từ một số thư viện (TidyHTML?)

0

Bạn phải nhận trợ giúp chỉ bằng các chuỗi biểu thức chính quy. Chúng giúp bạn tìm ra các thẻ html tiềm năng. Sau đó bạn có thể so sánh bên trong để chứa bất kỳ từ khóa html nào. Nếu nó được tìm thấy, hãy đưa ra một cảnh báo yêu cầu không sử dụng HTML. Hoặc đơn giản là xóa nó nếu bạn cảm thấy khác đi.

2

Nếu bạn không muốn người dùng có HTML trong dữ liệu nhập của họ, bạn có thể thay thế tất cả các ký tự '<' bằng thực thể HTML tương đương '& lt;' và tất cả '>' với '& gt;' (không có dấu cách giữa & và g)

14

Tôi biết đây là câu hỏi cũ nhưng tôi đã tìm kiếm thứ gì đó toàn diện hơn có thể phát hiện những thứ như thực thể HTML và bỏ qua các cách sử dụng khác của < và> ký hiệu. Tôi đã đến với lớp học sau đây hoạt động tốt.

Bạn có thể chơi với nó sống ở http://ideone.com/HakdHo

Tôi cũng tải lên này để GitHub với một loạt các bài kiểm tra JUnit.

package org.github; 

/** 
* Detect HTML markup in a string 
* This will detect tags or entities 
* 
* @author [email protected] - David H. Bennett 
* 
*/ 

import java.util.regex.Pattern; 

public class DetectHtml 
{ 
    // adapted from post by Phil Haack and modified to match better 
    public final static String tagStart= 
     "\\<\\w+((\\s+\\w+(\\s*\\=\\s*(?:\".*?\"|'.*?'|[^'\"\\>\\s]+))?)+\\s*|\\s*)\\>"; 
    public final static String tagEnd= 
     "\\</\\w+\\>"; 
    public final static String tagSelfClosing= 
     "\\<\\w+((\\s+\\w+(\\s*\\=\\s*(?:\".*?\"|'.*?'|[^'\"\\>\\s]+))?)+\\s*|\\s*)/\\>"; 
    public final static String htmlEntity= 
     "&[a-zA-Z][a-zA-Z0-9]+;"; 
    public final static Pattern htmlPattern=Pattern.compile(
     "("+tagStart+".*"+tagEnd+")|("+tagSelfClosing+")|("+htmlEntity+")", 
     Pattern.DOTALL 
    ); 

    /** 
    * Will return true if s contains HTML markup tags or entities. 
    * 
    * @param s String to test 
    * @return true if string contains HTML 
    */ 
    public static boolean isHtml(String s) { 
     boolean ret=false; 
     if (s != null) { 
      ret=htmlPattern.matcher(s).find(); 
     } 
     return ret; 
    } 

} 
2

Tôi đang sử dụng regex:

[\S\s]*\<html[\S\s]*\>[\S\s]*\<\/html[\S\s]*\>[\S\s]*

Vì vậy, trong JAVA nó trông giống như:

text.matches("[\\S\\s]*\\<html[\\S\\s]*\>[\\S\\s]*\\<\\/html[\\S\\s]*\\>[\S\s]*");

Tệp phải khớp với bất kỳ tệp XML chính xác (cũng như một số không chính xác) nào đó có chứa phần tử "html". Vì vậy, có thể có dương tính giả.

Edit:

Kể từ khi tôi đã đăng tải rằng, tôi đã gỡ bỏ phần cuối cùng với yếu tố html bế mạc, như tôi đã tìm thấy một số trang web không sử dụng nó. (?!) Vì vậy, trong trường hợp, bạn thích dương tính giả để phủ định sai, tôi khuyến khích để làm điều đó!

0

Dưới đây sẽ khớp với bất kỳ thẻ nào.Bạn cũng có thể trích xuất thẻ, thuộc tính và giá trị

Pattern pattern = Pattern.compile("<(\\w+)(+.+)*>((.*))</\\1>"); 
    Matcher matcher = pattern.matcher("<as testAttr='5'> TEST</as>"); 
    if (matcher.find()) { 
     for (int i = 0; i < matcher.groupCount(); i++) { 
      System.out.println(i + ":" + matcher.group(i)); 
     } 
    } 
Các vấn đề liên quan