2016-07-01 4 views
0

私は<pre>タグを含むHTMLコンテンツを持っています。 <pre>コンテンツの角かっこはすべてHTMLエンティティを使用してエスケープする必要があります。つまり、<&lt;になり、>&gt;になるはずです。他のタグを含むHTMLの前のタグを見つける必要があります

まずは、問題のあるコンテンツがどのファイルに含まれているかを把握したいだけです。

BAD:誰もが、正規表現を使用してこれを行う方法を考えることができる正規表現はこれと一致してはならない:正規表現は、この

<body> 
    <h1>My Content</h1> 
    <pre class="some-class"> 
     <foo> 
      <bar>Content</bar> 
      <script> 
       alert('Hi!'); 
      </script> 
     </foo> 
     <br> 
    </pre> 

    <p>The middle</p> 

    <pre class="other-class"> 
     <bar> 
      <foo>Text</foo> 
      <script> 
       alert('Bye!'); 
      </script> 
     </bar> 
     <br> 
    </pre> 
    <p>The end</p> 
</body> 

GOODと一致する必要があります。

<body> 
    <h1>My Content</h1> 
    <pre class="some-class"> 
     &lt;foo&gt; 
      &lt;bar&gt;Content&lt;/bar&gt; 
      &lt;script&gt; 
       alert('Hi!'); 
      &lt;/script&gt; 
     &lt;/foo&gt; 
     &lt;br&gt; 
    </pre> 

    <p>The middle</p> 

    <pre class="other-class"> 
     &lt;bar&gt; 
      &lt;foo&gt;Text&lt;/foo&gt; 
      &lt;script&gt; 
       alert('Bye!'); 
      &lt;/script&gt; 
     &lt;/bar&gt; 
     &lt;br&gt; 
    </pre> 
    <p>The end</p> 
</body> 
+8

なぜ人々は、彼らが代わりに正規表現の適切なパーサを使用する必要があります理解したくない?...正規表現の質問の半分は、HTML/XMLをパースについて..です – Jens

+0

@Jens奇数はRegexないHTMLパーサーを使用 – Shafizadeh

+0

@Shafizadeh私は知らない – Jens

答えて

1

正規表現の使用.*?で最短一致を検索します。 また、.に改行文字を一致させるには、DOT_ALL、(?s)が必要です。

Pattern prePattern = Pattern.compile("(?si)(<pre[^>]*>)(.*?)</pre>"); 
StringBuffer sb = new StringBuffer(html.length() + 1000); 
Matcher m = prePattern.matcher(html); 
while (m.find()) { 
    String text = m.group(2); 
    text = text.replace("<", "&lt;").replace(">", "&gt;"); 
    m.appendReplacement(sb, m.group(1) + text + "</pre>"); 
} 
m.appendTail(sb); 
html = sb.toString(); 
+0

ありがとう@Joop。それは近いようですが、RegExは機能しません。あなたはhttp://www.regexplanet.com/advanced/java/index.htmlでそれを試すことができます。エスケープされた文字とエスケープされていない文字の両方に一致することがわかります。 – Webucator

+0

これはjavaで働いていました。 ''(?si) ''(ドットオール+大文字小文字を区別しない)とeager-evaluation( '*?')は固有です。これは、あらかじめフォーマットされたセクション内でのみ実行されます。あなたはjavaで試しましたか? –

+0

交換部品がうまく動作します。サブタグを含むタグだけでなく、すべてのプレタグで実行されます。しかし、私はJSoupを使って、サブタグを含むpreタグにマッチさせることができます。あなたのRegExと組み合わせれば、その仕事ができます。だから、私は今良いです。ありがとう! – Webucator

0

@Jensと@Joopのおかげで、私はJSoupパーサーとRegExを組み合わせたソリューションを使用しました。

  1. 子要素を含むすべての<前>要素検索:

    文書ドキュメント= Jsoup.parse(HTML)を、 要素badPres = doc.select( "pre:has(*)");

  2. @ JoopのRegExソリューションを適用したものをループします。

関連する問題