0

タグに属さない HTML/XML 形式の文字列内のシンボルを確実<に見つけて置換する方法を見つけようとしています。>

基本的に、私は HTML 文字列から始めて、それを PDFLib で使用可能なものに変換します。PDFLib は、XML の形式を使用して、PDF として書かれるドキュメントを記述します。ただし<、コンテンツ内に がある場合、タグの開始と見なされ、解析例外がスローされます。

入力例:

<p>This is a test where 6 < 9</p>
<p>This is part of <strong>The same test</strong></p>
<p>This should also work 6<99999</p>

を囲むテキスト<は必ずしも数字ではなく、ユーザーが入力したものでありGrade<C、 、Blue<Red<GreenTest < Test2.... など、実際には何でもかまいません。

必要な出力

This is a test where 6 <charref fontname=Helvetica encoding=unicode>&lt;<resetfont> 9\n
This is part of <fontname=Helvetica fontstyle=bold encoding=unicode>The same test<resetfont>\n
This should also work 6<charref fontname=Helvetica encoding=unicode>&lt;<resetfont>99999\n

str_replaceとを試しましたが、確実にタグをそのままにして、コンテキスト内preg_replaceの だけを置き換えるソリューションが見つかりません。<

は開始タグとしてもDOMDocument認識されるため、DOM の解析も失敗するようです。<

文字列で使用htmlspecialcharsすると、すべてのタグも同様に変換<>&lt;&gt;れますが、これは良くありません。

誰にもアイデアはありますか?

4

4 に答える 4

1

この質問の回答を使用してみてください。

不正な形式の xml を修復する方法

これをそのまま追加しようとしましたが、StackOverflow では、回答に説明を追加する必要があります。そうしないと、回答として受け入れられないコメントに自動的に変換されます。

于 2013-05-29T16:39:19.633 に答える
1

< に遭遇した場合は start char から char ごとに文字列を読み取ってみてください > がスペースなしで見つかった場合はバッファにプッシュし、それ以外の場合は < に遭遇した場合は以前を < としてマークし、次をバッファに入れます ...文字列の終わりまで繰り返します

于 2013-05-29T15:30:46.707 に答える
0

HTMLエンティティは、 HTML&lt;&gt;で置き換えるために使用されるエンティティ<>です。<code>タグを使っても。<>これらのエンティティを使用して、HTML タグで置き換えることができます。www.w3schools.com/html/html_entities.asp

于 2013-05-29T16:19:02.103 に答える
0

もはや維持されていませんが、html5lib の php ポートはおそらく悪いマークアップを解析するための最善の策だと思います。

次のような単純な呼び出し:

require_once 'your-path-path-to-html5lib/Parser.php';
$dom = HTML5_Parser::parse($input);

不正なマークアップを取り込んで$input、有効な php DOMDocumentを返します。

そこから、 または を使用して文字列に保存し$dom->saveHTML()たり$dom->saveXML、DOM API を使用して必要なビットを抽出したりできます。

元のデータにそれが含まれていなくても、これによりheadandなどを含む完全な HTML ドキュメントが生成されることに注意してください。body

HTML フラグメントを解析したいだけの場合は、次のようにできます。

$dom = HTML5_Parser::parseFragment($input);

これはDOMNodeListを返します。

于 2013-05-29T16:10:36.557 に答える