1

これがxmlコードです。このテキストを文字列としてロードし、ネストされたすべてのタグとコンテンツをhtmlentitiesに置き換える必要があります。

<?xml version="1.0" encoding="utf-8"?>
<data>
<target><x id="25e02e3e839c-a1e6b03cb682"  pid="NLSheets" name="NLSheets" />Sheets"</target>
<target>"<x id="3510a371bdf8-861b965564ea" pid="NLTable" name="NLTable" />Table"</target>
<target>"<x id="48a1560eaa68-c400c8394f0a"  pid="NLCaption" name="NLCaption" />Caption"</target>
</data>

タスクに次のphpコードを使用しました。

function html_entities($matches) {
  return str_replace($matches[1], htmlentities($matches[1]), $matches[0]);
}

function get_tag( $tagname, $xml ) {
 $pattern = "/<$tagname ?.*>(.*?)<\/$tagname>/"; 
 $content = preg_replace_callback($pattern,  html_entities, $xml);
 return $content;
}

$content = get_tag('target', $str);

echo $content; 

ここで問題は正規表現にあります。正規表現を使用しました

get_tag関数でわかるように。$pattern = "/<$tagname ?.*>(.*?)<\/$tagname>/";これは実行時に次のように構築されます

/<target ?.*>(.*?)<\/target>

今、私は問題を修正することができません...ネストされたタグの値はhtmlentitiesに変換されません。

助けてください

4

1 に答える 1

1

行を次のように変更します。

$pattern = "/<$tagname ?.*?>(.*?)<\/$tagname>/"; 

>開始タグの終了部分()の検索が行き過ぎて内部コンテンツを取得するのを防ぐために、余分な貪欲でない修飾子が必要です(したがって、括弧で囲まれたグループ化、つまりhtmlentitiesで使用できなくなります)。

これを少し改善するには、最後に「s」修飾子を使用して、コンテンツ内で改行を許可し(ドット文字にはデフォルトで改行が含まれないため)/、開始タグ内で改行を許可しないようにします。そして、あらゆる種類の空白が要素名を属性から分離し、終了タグの最後に空白を許可できるようにします。

$pattern = "/<$tagname(?:\s[^\/]*?)?>(.*?)<\/$tagname\s*>/s";

そしてそれを短くします:

$pattern = "@<$tagname(?:\s[^/]*?)?>(.*?)</$tagname\s*>@s";

XMLパーサーを使用する方が安全なのは、これらの考えられるすべてのエッジケースを処理するためです。たとえば、これはキャッチしません:

<target><![CDATA[ </target> ]]></target>
于 2012-04-19T18:19:23.183 に答える