2009-06-02 6 views
1

しばらくの間これを解決しようとしていました。正規表現を使ってhtmlを整える

出典:

<html> 
    <head> 
    <title> 
      Some title 
     </title> 
    </head> 
</html> 

募集結果:

<html><head><title>Some title</title></head></html> 

私は改行を削除する正規表現を必要とし、htmlタグの間にタブとスペースは、以下の例に示されました「Some title」の前に空白をトリムすることはオプションです。 これを試してみてください、私は任意のヘルプ

+1

削除する空白をどのように知っていますか?なぜあなたは空白を取り除いているのですか?*いくつかのタイトルですが、*ではありませんか?あなたのルールは何ですか? –

+0

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

答えて

0

s/\s*(<[^>]+>)\s*/\1/gs

または、C#で:

Regex.Replace(html, "\s*(<[^>]+>)\s*", "$1", RegexOptions.SingleLine);

+0

最初の文字は空白にすることはできません。また、 "< 3 and b > 4"のような有効なHTML文字列は式で削除されます –

+0

そして終了タグと一致しません。 –

+0

わかりました。私はこの権利を読まなかった。 –

0

のために感謝されるだろう:HTMLは厳しいです

s/[^\w\/\d<>]+/gs 
0

s/>\s+</></gs

20

場合は、XMLリーダーとそれをロードし、フォーマットせずに戻ってそれを書きます。タグ内の空白は保持されますが、それらの間の空白は保持されません。

+4

ホイールを再発明するわけではありません。 – Pesto

+0

悪い考えではない... –

+0

はスキーマによって異なる場合があります。タグ内の空白の保持は、スキーマ定義の特定の属性です。 – Jherico

0

これは、タグとタグとテキストの間のスペースの間の空白を削除します。

s/(\s*(<))|((>)\s*)/\2\4/g 
1

\ dは、Perl 5.8および5.10では[0-9]と一致しません。数字属性( "\ x {1815}"や "\ x {FF15}"など)を持つUNICODE文字と一致します。 [0-9]を意味する場合は、[0-9]を使用するか、バイトプラグマを使用する必要があります(ただし、すべての文字列を1バイト文字に変換します)。

正規表現は基本的にHTMLの解析時に問題があります(理由はCan you provide some examples of why it is hard to parse XML and HTML with a regex?を参照)。必要なのはHTMLパーサーです。さまざまなパーサーを使用した例については、Can you provide an example of parsing HTML with your favorite parser?を参照してください。

HTMLAgilityPack answerが役に立ちます。

-1

改行の削除が自分のhtmlを台無しにしていたので、私は新しい行を保存したかったのです。そこで私は次のように行きました。 。

private static string ProcessHTMLFile(string input) 
{ 
    string opt = Regex.Replace(input, @"()*", "", RegexOptions.Singleline); 
    opt = Regex.Replace(opt, @"[\t]*", "", RegexOptions.Singleline); 
    return opt; 
} 
0
Regex.Replace(input, "<[^>]*>", String.Empty); 
0

XSLTでのソリューションは、次のようになります。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">  
<xsl:output method="xml" encoding="UTF-8" indent="no"/> 

<xsl:template match="*|@*"> 
    <xsl:copy> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

<!-- trim whitespaces from the content --> 
<xsl:template match="text()"> 
    <!-- remove from tag to content --> 
    <xsl:variable name="trimmedHead" select="replace(.,'^\s+','')"/> 
    <xsl:variable name="trimmed" select="replace($trimmedHead,'\s+$','')"/> 
    <xsl:value-of select="$trimmed"/> 
</xsl:template> 

<!-- do not trim where text content exist --> 
<xsl:template match="text()"> 
    <xsl:if test="not(matches(.,'^\s+$'))"> 
     <xsl:value-of select="."/> 
    </xsl:if> 
</xsl:template> 

あなたが使用したいテンプレートを選択することができます。最初のものはコンテンツが存在するときにもすべての空白を削除し、2番目のものは空白または改行だけがあるときだけ削除します。

関連する問題