2017-02-26 1 views
3

タスク:私たちはHttpWebRequest(約6,000件の通話)を介してコンテンツ用にHTMLを削っています。この文字列はトリムされ、XMLとして処理するためにSQL Server 2014データベースに格納されます。すべてのHTML imgクローズタグをXMLに準拠させるにはどうすればいいですか? (<img>~<img/>)

問題:SQL Serverでは、画像タグのためにXML解析エラー「...end tag does not match start tag」が表示されます。

は今、私はむしろ洗練とSQL Serverの潜在的欠陥のある解決策を持っています。

サンプル文字列

<div someattr="aaa"> 
    <div class="bbb">Some Text</div> 
    <img src="image.jpg" width="150">  <-- Notice the lack of /> 
</div> 

望ましい結果

<div someattr="aaa"> 
    <div class="bbb">Some Text</div> 
    <img src="image.jpg" width="150"/>  <-- Notice the /> 
</div> 

私はASP.Netで無数の正規表現の組み合わせを試してみた、と私は良いよりも害を行うように見えます。あらゆる指導や指導をいただければ幸いです。

謹んで、

ジョン

答えて

2

私は、HTMLパーサーを使用してデータを単なる文字列よりも良い方法で保存することをお勧めします。あなたが正規表現で迅速かつ汚いソリューションのために行くしている場合しかし、これはあなたを助けるかもしれない:この正規表現のための

ルック:

(<img[^>]*?[^\/]\s*)(>) 

し、それを置き換える:

$1/$2 
  • [^>]*?>を除き、できるだけ少ない文字を探します。
  • [^\/]\s*は、最後のチャracterの前に>はスラッシュではありません/スラッシュの後に空白が続く
  • 最初と2番目の部分は$1$2にグループ化されています。既にスラッシュがない場合、そしてそれがimgタグである場合にのみ一致します。
  • <img ...>タグの間に文字列として>文字がある場合、またはタグがすべて<img title=""で閉じていない場合は、機能しません。ここで

ライブの例です:https://regex101.com/r/HIxIIR/1以下

+0

おかげで、これは、システムがそれを可能にするとき、私は、 –

+1

ウィル賞2時間で恵みを探していたものです –

1

は、一部のコンバータがそこにありますが、最初のXHTMLためにあなたのhtmlを変換するようにしてください。正規表現とhtmlは私のために働いていませんでした。

1

残念ながら、HTMLは有効なXML(XHTMLを除く)である必要はありません。だからあなたは未閉じのタグを期待している。 HTMLは明示的に、<br >のように一部のタグをクローズできないようにしています。実際にはHTMLでも実際のエラーである、本当に欠けているタグや重複するタグがあっても堅牢に構築されています。

期待するHTMLに応じて、これらのエラーの一部をXMLに修正しようとすることができます。たとえば、属性値とコンテンツが異なるすべての構造にわたって常に同じになることがわかります。あなたが得るHTMLが何かになることができれば、私は運が悪いと恐れています。たぶんあなたはNVARCHAR(MAX)としてそれを格納することができますし、データベースでそれをクエリする必要がある場合はLIKEを使用してください。

1

はT-SQLを使用して迅速かつ汚いソリューションです。

Rextesterデモ:http://rextester.com/TLF34624

CREATE FUNCTION processHtml(@html VARCHAR(MAX)) 
RETURNS VARCHAR(MAX) 
AS 
BEGIN 
    DECLARE @remainingHtml VARCHAR(MAX), 
      @processedHtml VARCHAR(MAX), 
      @imgPos INT, 
      @closingAngleBracketPos INT, 
      @openingAngleBracketPos INT; 
    SET @remainingHtml = @html; 
    SET @imgPos = PATINDEX('%<img%[^</]>%', @remainingHtml); 
    WHILE @imgPos > 0 
    BEGIN 
     SET @processedHtml = CONCAT(@processedHtml, SUBSTRING(@remainingHtml, 1, @imgPos - 1)); 
     SET @remainingHtml = SUBSTRING(@remainingHtml, @imgPos, LEN(@remainingHtml)); 
     SET @closingAngleBracketPos = PATINDEX('%[^/]>%', @remainingHtml); 
     SET @openingAngleBracketPos = CHARINDEX('<', @remainingHtml, 2); 
     IF @closingAngleBracketPos < 0 
      SET @imgPos = -1; 
     ELSE IF @closingAngleBracketPos < @openingAngleBracketPos 
     BEGIN 
      SET @processedHtml = CONCAT(@processedHtml, SUBSTRING(@remainingHtml, 1, @closingAngleBracketPos), '/>'); 
      SET @remainingHtml = SUBSTRING(@remainingHtml, @closingAngleBracketPos + 2, LEN(@remainingHtml)); 
      SET @imgPos = PATINDEX('%<img%[^</]>%', @remainingHtml); 
     END 
     ELSE 
     BEGIN 
      SET @processedHtml = CONCAT(@processedHtml, SUBSTRING(@remainingHtml, 1, @openingAngleBracketPos - 1)); 
      SET @remainingHtml = SUBSTRING(@remainingHtml, @openingAngleBracketPos, LEN(@remainingHtml)); 
      SET @imgPos = PATINDEX('%<img%[^</]>%', @remainingHtml); 
     END 
    END 

    SET @processedHtml = CONCAT(@processedHtml, @remainingHtml); 
    RETURN @processedHtml; 
END 
関連する問題