0

ブラウザにコンテンツを表示するために XHTML Transitional doctype を使用しています。ただし、コンテンツは表示され、ブラウザーに出力する前に最終的な仕上げを行うために XML パーサー (DOMDocument) を通過します。

私は自分のウェブサイトにカスタム設計された CMS を使用しているため、サイトに変更を加えることができます。WordPress ウィジェットと同様の方法で Web サイトに HTML スクリプトを表示できるモジュールがあります。

私が今直面している問題は、このモジュールを介して提供されるコードが有効な XHTML 形式であることを確認する必要があることです。そうしないと、モジュールがコードを有効な XHTML に変換する必要があります。現在、入力コードの一部が XHTML に準拠していない場合、XML パーサーが壊れて警告がスローされます。

私が探しているのは、URL に存在するエンティティと、TextArea コントロールを介して提供される入力のテキスト部分をエンコードするソリューションです。たとえば、次の文字列はパーサーを壊し、エンティティ参照エラーを発生させます。

<script type="text/javascript" src="http://www.abcxyz.com/foo?bar=1&sumthing"></script>

また、次の行でも同じエラーが発生します。

<a href="http://www.somesite.com">Books & Cool stuff<a/>

PShtmlentitiesまたはhtmlspecialcharsを使用すると、タグの山かっこも変換されますが、これは必須ではありません。文字列のURLとテキスト部分をエスケープ/エンコードする必要があるだけです。

どんな助けでも大歓迎です。

ありがとう、よろしく、 ワカール・ムシュタク

4

3 に答える 3

1

最初に有効な XHTML を生成する必要があります。すべての属性は、htmlentitied にする必要があります。

<script type="text/javascript" src="http://www.abcxyz.com/foo?bar=1&sumthing"></script>

する必要があります

<script type="text/javascript" src="http://www.abcxyz.com/foo?bar=1&amp;sumthing"></script>

<a href="http://www.somesite.com">Books & Cool stuff</a>

する必要があります

<a href="http://www.somesite.com">Books &amp; Cool stuff</a>

有効な XHTML を常に生成するのは簡単ではありません。可能であれば、後処理を行う別の方法を見つけることをお勧めします。

于 2011-08-07T17:01:00.950 に答える
0

HTML Tidy は、無効な HTML を修正し、結果のマークアップのレイアウトとインデント スタイルを改善することを目的としたコンピューター プログラムおよびライブラリです。

http://tidy.sourceforge.net/

修正可能な不適切な HTML の例:

  • 終了タグの欠落または不一致、タグの混同
  • 不足しているアイテムの追加 (いくつかのタグ、引用符など)
  • 独自の HTML 拡張機能の報告
  • マークアップのレイアウトを定義済みのスタイルに変更する
  • 文字を一部のエンコーディングから HTML エンティティに変換する
于 2011-08-07T16:57:24.277 に答える
0

簡単なコメントで既に提案されているように、PHP tidy 拡張機能Docsを使用すると問題を非常に快適に解決できます。

DomDocumentHTML フラグメント (優れたタグ スープであっても) を何かに変換するにはSimpleXML、次のようなものを使用できます。

$config = array(
    'output-xhtml' => 1,
    'show-body-only' => 1
);
$fragment = tidy_repair_string($html, $config);
$xhtml = sprintf("<body>%s</body>", $fragment);

例:タグのスープ html をtidy_repair_stringDocsで有効な xhtml としてフォーマットします。

Tidy には多くのオプションがあります。使用されるこれら 2 つは、フラグメントと XHTML の互換性のために必要です。

現在残っている唯一の問題は、この XHTML フラグメントにエンティティが含まれている可能性があることDomDocumentです。SimpleXMLたとえば、&nbsp;. これとその他は XML では定義されていません。

関係する限りDomDocument(あなたがそれを使用したと書いています)、それらのエンティティを処理するxmlの代わりにhtmlのロードもサポートしています:

$dom = new DomDocument;
$dom->loadHTML($xhtml);

例: DomDocument を使用した HTML の読み込み

于 2011-08-07T19:08:53.900 に答える