2014年2月28日金曜日

PHP: 正規表現で取得したい文が途中で切れてしまう

PHP の DOMElement の textContent の文を、
preg_mach() で取り出そうとした時に、結果が途中で途切れてしまった。
// HTML 読み込み
$domDocument = new DOMDocument();
$domDocument->loadHTML('test.html');

// 目標の文字列を取得
$domElement = domDocument->getElementById('target_data');
$text = $domElement->textContent;
echo $text;  // "データ:ABC DEF HIJ"

// 文字列中から必要な部分を抽出
preg_match('/^データ:(.*)$/', $text, $matches);

// 取得できたかテスト
echo $matches[1];  // "ABC" <- "DEF HIJ" がない

原因は textContent の文字列中に改行コード \n が含まれていたためであった。
 正規表現の . は「改行を除く任意の1文字」を表すため、
 改行以前の部分だけにマッチしてしまっていた。

 対象の文字列を Web ブラウザ上へ表示した場合、
 \n が半角スペースとして表示されるため気付かなかった。

 マッチングを行う前に str_replace() で改行コードを取り除くことで解決できた。
$text = str_replace("\n", '', $text);

 ---

 DOM - PHP.net
 http://jp2.php.net/manual/ja/book.dom.php

0 件のコメント:

コメントを投稿