2010-06-16 23 views
19

Bir dizginin HTML verisi içerip içermediğini nasıl bulabilirim? Kullanıcı, web arayüzü üzerinden girdi sağlar ve basit bir metin veya kullanılmış HTML formatı kullanmış olması oldukça olasıdır.Dize html verileri içeriyorsa nasıl bulunur?

+0

Olası kopyalar (http://stackoverflow.com/questions/204646/how-to- validate-that-a-string-doesnt-içerir-html-kullanarak-c-keskin) – nullpointer

+0

OP bunu Java'da yapmak istiyor, bu nasıl bir kopya mı? –

cevap

4

HTML etiketlerini aramak için normal ifadeleri kullanabilirsiniz. senin yedekleme fasulye ise

+0

Ah, eski iyi sorun # 2. Tom doğru, regex işini yapmanın en doğrudan yoludur ve genellikle, gitmenize yardımcı olacak birçok çevrimiçi örnek vardır. –

+0

@Alex Larzelere: Sorun # 2? Açıklayabilir misin? Bu bir xkcd referansı mı ("şimdi iki probleminiz var") veya başka bir şey var mı? – CPerkins

+0

@Cperkins tam olarak bu. Ol 'problemi # 2, sorun # 1 elbette orijinal olarak yapmaya çalıştığınız şeydir. –

2

, sen, normal ifadeleri (yavaş) kullanın veya sadece "<>" karakter bulmak için deneyebilirsiniz vb <b> veya <i> ... olarak html etiketlerini bulmak için deneyebilirsiniz. Kullanıcının html kullandığını veya olmasını istemediğinize bağlıdır.

kullanıcı <asdf> yazabilirsiniz unutmayın. Kullanılan html'nin geçerli olduğundan% 100 emin olmak istiyorsanız, bazı kütüphanelerden (TidyHTML belki?)

0

Karmaşık bir html ayrıştırıcısı kullanmanız gerekecek. Sadece normal ifade dizeleriyle ilgili yardım almalısınız. Potansiyel html etiketlerini bulmanıza yardımcı olurlar. Daha sonra iç herhangi bir html anahtar kelimeleri içerecek şekilde karşılaştırabilirsiniz. Bulunduğunda, HTML kullanmamak için bir uyarı koyun. Ya da başka türlü hissederseniz, sadece silin.

2

Kullanıcının girişinde HTML olmasını istemiyorsanız, '<' karakterlerinin tümünü '& lt;'; ve '>' ile '& gt;'; (& ve g arasında boşluk)

14

Bu eski bir soru olduğunu biliyorum ama bunun karşılaştım ve HTML varlıklar gibi şeyler algılamak olabilir ve < ve> sembollerin diğer kullanımları görmezden olacağını daha kapsamlı bir şey arıyordu. İyi çalışan bir sınıfla geldim.

Sen http://ideone.com/HakdHo

canlı onunla oynayabilir Ayrıca JUnit testleri bir grup ile GitHub bu yükledi.

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

kullanıyorum regex:

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

Yani JAVA görünüyor gibi:

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

Bir "html" öğesinde bulunan herhangi bir doğru (yanı yanlış) XML dosyasıyla eşleşmelidir. Yani yanlış pozitifler olabilir.

Düzenleme: Bazı web siteleri bunu kullanmıyorum buldum gibi, html elemanı kapanış ile son bölümünü kaldırdık, o gönderdiniz beri

. (?!) Öyleyse yanlış pozitiflere yanlış pozitifleri tercih edersiniz, bunu yapmayı cesaretlendiririm!

0

Aşağıdaki etiketler ile eşleşecektir.Ayrıca, etiket, nitelikleri ve değeri çıkarabilir

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)); 
     } 
    } 
[Nasıl bir dize C# kullanarak HTML içermediğini doğrulamak için] bir
İlgili konular