この質問は以前によく聞かれたようですが、非常に長く、「<」や「{」などの特殊文字を含むデータの有効な解決策が見つかりませんでした。
サーバー上のPHPに巨大なXMLデータを送信しています。これは次のようになります。
<root><id>1</id><text>Here is a very long text with
line breaks, white-spaces and many very unsual charchaters, e.g. < % & }
the text can be more then 5000 characters long
</text></root>
サーバー側では、テキストタグ間の「生データ」を取得しようとしています。「テキストタグ」内の生データには、空白、改行、奇妙な文字など、イメージできるものなら何でも含めることができます。私が提出するのは、ソース コードとテキストで、CKEditor とコード シンタックスハイライターによってフォーマットされています。
私はこれを読んで、基本的に誰もが「XMLパーサーを使用する」と言います.domDocumentはRegExを使用しないように.
まず、たとえばいくつかの RegEx ステートメントを試しました。これは私が試した唯一のものではありません。データに角かっこが含まれていて、データが長すぎる場合、失敗します。
//#<text[^>]*>[\s\S]*?</text>#
$regex = "#<".$element_name."[^>]*>[\s\S]*?</".$element_name.">#";
$found = preg_match($regex, $xml, $matches);
if ($found != false)
{
$result = $matches[0];
return $result;
}
次に、これを試してみました。これは、タグ内のデータがあまり奇妙でない場合に機能します。パーサーは角かっこ「<」が好きではなく、xml が有効ではないと考えています。
function getTextBetweenTags($tag, $html, $strict=0)
{
/*** a new dom object ***/
$dom = new domDocument;
/*** load the html into the object ***/
if($strict==0)
{
$dom->loadXML($html);
}
else
{
$dom->loadHTML($html);
}
/*** discard white space ***/
$dom->preserveWhiteSpace = false;
/*** the tag by its tag name ***/
$content = $dom->getElementsByTagname($tag);
/*** the array to return ***/
//$out = array();
foreach ($content as $item)
{
/*** add node value to the out array ***/
//$out[] = $item->nodeValue;
/*** return only the first found element value ***/
return $item->nodeValue;
}
/*** return empty string if nothing found ***/
return "";
}
だから私の質問は:
私が正確に知っている場合、データ内に開始と終了の「テキスト」タグが1つしかない場合、PHPで生データを読み取る最良の方法は何ですか?
誰かが私に動作する正規表現またはコードスニペットをくれたら、それは素晴らしいことです.
私の中程度の英語で申し訳ありません。
===回答への回答===回答への回答===回答への回答===
わかりました、BogdanM と Steven からの両方の回答は機能しますが、私のお気に入りの回答は BogdanM からのものです。
私がしたこと。これを機能させるには:
- クライアント サイトで独自の XML を作成し、CDATA を使用してパーサーにデータの開始位置と終了位置を伝えます。
- サーバー側では、SimpleXML を使用してデータを解析します。CDATA を使用すると、解析に問題はなくなります。データがどんなに「変」でも構いません。
- HTTP-GET でビッグ データを送信する際によくある「ルーキー エラー」を排除しました。私は今、HTTP-POSTを使用して制限を設けていません
助けてくれてありがとう。