Source for file Scraper.php
Documentation is available at Scraper.php
* <p>指定したコンテンツ文字列の正規化および正規化した文字列からの特定の情報を<br/>
* 抽出する手段を提供するクラスを定義しています。</p>
* @copyright Copyright (c) 2006-2007, Nihon Unisys, Ltd.
* @license http://www.tyzoh.jp/rinza/licenses/LICENSE-1.0.txt Rinza Public License
* @example examples/sample.php
require_once 'Rinza/IE/Util.php';
* <a>タグ指定リンク情報取得のためのScraper::getListOfLinks()用オプション
define('RINZA_IE_SCRAPER_LINK_INFO_A', 11);
* <area>タグ指定リンク情報取得のためのScraper::getListOfLinks()用オプション
define('RINZA_IE_SCRAPER_LINK_INFO_AREA', 12);
* addMenuItem()指定リンク情報取得のためのScraper::getListOfLinks()用オプション
define('RINZA_IE_SCRAPER_LINK_INFO_MENU', 21);
* 上記すべてのリンク情報取得のためのScraper::getListOfLinks()用オプション
define('RINZA_IE_SCRAPER_LINK_INFO_ZALL', 99);
* <p>指定したコンテンツ文字列の正規化および正規化した文字列から特定の情報を抽出する
* <li>指定された2つの文字列に挟まれる部分の抽出</li>
* <li>指定キーワードに関連するリンク情報の抽出</li>
* <li>HTMLタグ部分を取り除いた文字列の抽出</li>
* <li>HTMLコメント部分を取り除いた文字列の抽出</li>
* $s = & new Rinza_IE_Scraper($web_content_string);
* echo htmlspecialchars($s->getNormarizedString());
* オブジェクト生成時に指定されたコンテンツ文字列
* オブジェクト生成時に指定されたコンテンツ文字列の長さ
var $_origin_stirng_length;
var $_normarized_string_length;
/** コンテンツ文字列中のhtml開始・終了タグ間を処理対象とするか否かのフラグ
/** コンテンツ文字列中のhtml開始タグの位置
/** コンテンツ文字列中のhtml終了タグの位置
* @param string $pString コンテンツ文字列(既定値:NULL)
* @param string $pEncoding 文字列処理時の文字エンコーディング(既定値:UTF-8)
function __construct($pString = NULL, $pEncoding = 'UTF-8', $pHtmlRange = TRUE) {
$this->_encoding = $pEncoding;
$this->_html_range = $pHtmlRange;
$this->_origin_string = $pString;
$this->_origin_stirng_length = 0;
if (empty($detect_encoding)) {
$block = $this->_getPartialBlock($pString, 'charset=', '"', 0);
$this->_origin_stirng_length = mb_strlen($this->_origin_string, $pEncoding);
$this->_normarized_string = NULL;
$this->_normarized_string_length = 0;
* Scraperが処理するコンテンツ文字列の(変更)設定
* @param string $pString コンテンツ文字列(既定値:NULL)
* Scraperが現在処理対象としているコンテンツ文字列の取得
* @return string Scraperが現在処理対象としているコンテンツ文字列
return $this->_origin_string;
* Scraperに渡されているコンテンツ文字列の正規化文字列の取得
* <p>正規化:コンテンツ文字列に含まれる次のコードを空白1文字に変換<br/>
* @return string 正規化されたコンテンツ文字列
if (!is_null($this->_normarized_string)) {
return $this->_normarized_string;
$replace_char = array(chr(9), chr(10), chr(13)); // chr(9)= HT, chr(10)=LF, chr(13)=CR
$converted_string = str_replace($replace_char, chr(32), $this->_origin_string); // chr(32)=" ";
$this->_normarized_string = trim($converted_string);
$this->_normarized_string_length = mb_strlen($this->_normarized_string, $this->_encoding);
if (!empty($this->_normarized_string) && $this->_html_range) {
if (($html_bgn_pos = mb_strpos(strtolower($this->_normarized_string), '<html', 0, $this->_encoding)) === FALSE) {
$this->_html_begin = $html_bgn_pos;
if (($html_end_pos = mb_strrpos(strtolower($this->_normarized_string), '</html>', $this->_encoding)) === FALSE) {
$this->_html_end = $this->_normarized_string_length - 1;
$this->_html_end = $html_end_pos + 6;
$this->_normarized_string = mb_substr($this->_normarized_string, $this->_html_begin, $this->_html_end - $this->_html_begin + 1, $this->_encoding);
$this->_normarized_string_length = mb_strlen($this->_normarized_string, $this->_encoding);
return $this->_normarized_string;
* コンテンツ文字列から2つの指定文字列で挟まれる部分を抽出した文字列および抽出終了位置の取得
* <p>コンテンツ文字列が正規化されていない場合には,正規化を行う<br/>
* 指定文字列に対する抽出において,大文字・小文字の区別はしない</p>
* @param string $pStart 抽出開始部分を決めるための文字列(NULLの場合は,抽出元文字列の1文字目から抽出対象となる)
* @param string $pEnd 抽出終了部分を決めるための文字列(NULLの場合は,抽出元文字列の最終文字までが抽出対象となる)
* @param integer $pOffset 抽出元文字列のうち抽出開始対象とする位置を指定する(0オリジン)
* @return array 次をキーをもつ配列:
* <li>0 - 抽出された文字列(該当する抽出箇所がない,あるいは空白文字のみの場合 : NULL)</li>
* <li>1 - 抽出元文字列における抽出終了位置</li>
if (0< $pOffset && $pOffset < $this->_normarized_string_length - 1){
$string = mb_substr($string, $pOffset, $this->_normarized_string_length - $pOffset, $this->_encoding);
} elseif ($pOffset <= 0) {
return $rBlock = array($block, $pOffset);
$start_length = mb_strlen($pStart, $this->_encoding);
if ($start_pos === FALSE) {
return $rBlock = array($block, $pOffset);
$start_pos = $start_pos + $start_length;
$end_pos = mb_strlen($string, $this->_encoding);
if ($end_pos === FALSE) {
return $rBlock = array($block, $pOffset);
$end_length = mb_strlen($pEnd, $this->_encoding);
if ($end_pos > $start_pos) {
$block = trim(mb_substr($string, $start_pos, $end_pos - $start_pos, $this->_encoding));
return $rBlock = array($block, $pOffset + $end_pos + $end_length);
* コンテンツ文字列からのすべてのリンク情報の取得
* <p>コンテンツ文字列が正規化されていない場合には,正規化を行う</p>
* @param string $pURL コンテンツ文字列を取得したURL(既定値:NULL)
* @param integer $pOpt 対象とするリンク情報
* <li>RINZA_IE_SCRAPER_LINK_INFO_A - "<a>タグ"を対象(既定値)</li>
* <li>RINZA_IE_SCRAPER_LINK_INFO_AREA - "<area>タグ"を対象</li>
* <li>RINZA_IE_SCRAPER_LINK_INFO_MENU - "JavaScript addMenuItem()"を対象</li>
* <li>RINZA_IE_SCRAPER_LINK_INFO_ZALL - 上記すべてを対象</li>
* @return array 対象リンク情報のすべてを格納した以下のキーをもつ配列
* <li>RINZA_IE_SCRAPER_LINK_INFO_Aの場合 : "<a "から"</a>"の間の文字列</li>
* <li>RINZA_IE_SCRAPER_LINK_INFO_AREAの場合 : "<area "から">"の間の文字列</li>
* <li>RINZA_IE_SCRAPER_LINK_INFO_MENUの場合 : "addMenuItem("から")"の間の文字列</li>
* <li>RINZA_IE_SCRAPER_LINK_INFO_ZALLの場合 : 上記すべて</li>
* <li>RINZA_IE_SCRAPER_LINK_INFO_Aの場合 : hrefあるいはwindow.open()に指定されているURL</li>
* <li>RINZA_IE_SCRAPER_LINK_INFO_AREAの場合 : hrefに指定されているURL</li>
* <li>RINZA_IE_SCRAPER_LINK_INFO_MENUの場合 : locationに指定されているURL</li>
* <li>RINZA_IE_SCRAPER_LINK_INFO_ZALLの場合 : 上記すべて</li>
* <li>RINZA_IE_SCRAPER_LINK_INFO_Aの場合 : hrefあるいはwindow.open()に指定されているURLを絶対URLに変換したもの</li>
* <li>RINZA_IE_SCRAPER_LINK_INFO_AREAの場合 : hrefに指定されているURLを絶対URLに変換したもの</li>
* <li>RINZA_IE_SCRAPER_LINK_INFO_MENUの場合 : locationに指定されているURLを絶対URLに変換したもの</li>
* <li>RINZA_IE_SCRAPER_LINK_INFO_ZALLの場合 : 上記すべて</li>
* <li>title - リンクを説明する文字列</li>
function getListOfLinks($pURL = NULL, $pOpt = RINZA_IE_SCRAPER_LINK_INFO_A) {
$links[$links_idx]['info'] = mb_substr($block_info[0], 0, $a_pos , $this->_encoding);
$block_info[1] = $block_info[1] - (mb_strlen($block_info[0], $this->_encoding) - $a_pos) - 4;
$links[$links_idx]['info'] = $block_info[0];
$info_count = count($links);
$links_idx = $info_count;
$links[$links_idx]['info'] = $block_info[0];
$info_count = count($links);
// JavaScript addMenuItem()のリンク情報取得
$links_idx = $info_count;
$links[$links_idx]['info'] = $block_info[0];
// proprietary function additem()のリンク情報取得
$links[$links_idx]['info'] = $block_info[0];
$info_count = count($links);
for ($i = 0; $i < $info_count; $i++ ) {
$scraper->setString($links[$i]['info']);
if (($href_pos = mb_strpos(strtolower($links[$i]['info']), 'href', 0, $this->_encoding)) !== FALSE) {
$eq_pos = mb_strpos($links[$i]['info'], '=', $href_pos, $this->_encoding);
$gt_pos = mb_strpos($links[$i]['info'], '>', $href_pos, $this->_encoding);
// $js_pos = mb_strpos(strtolower($links[$i]['info']), 'javascript', $href_pos, $this->_encoding);
$js_chkblock_info = $scraper->getPartialBlock('=', '>', $href_pos);
if (($sp_pos = mb_strpos($links[$i]['info'], ' ', $href_pos, $this->_encoding)) === FALSE) {
if (($sp_pos = mb_strpos($links[$i]['info'], ' ', $eq_pos, $this->_encoding)) === FALSE) {
$chk_space = trim(mb_substr($links[$i]['info'], $eq_pos + 1, $sp_pos - $eq_pos, $this->_encoding), ' ');
$subblock_info = $scraper->getPartialBlock('=', '>', $href_pos);
} elseif ($sp_pos < $gt_pos) {
$subblock_info = $scraper->getPartialBlock('=', ' ', $href_pos);
$subblock_info = $scraper->getPartialBlock('=', '>', $href_pos);
$block_info[0] = $subblock_info[0];
$block_info[1] = $href_pos + mb_strlen($subblock_info[0], $this->_encoding);
$scraper->setString($subblock_info[0]);
$chkblock_info = $scraper->getPartialBlock('"', '"', $href_pos);
$block_info = $chkblock_info;
$chkblock_info = $scraper->getPartialBlock('\'', '\'', $href_pos);
$block_info = $chkblock_info;
$block_info[0] = trim($subblock_info[0], '", \'');
$block_info[1] = $href_pos + mb_strlen($subblock_info[0], $this->_encoding);
$scraper->setString($links[$i]['info']);
$block_info[1] = $href_pos;
$backup_pos = $block_info[1];
$scraper->setString($block_info[0]);
$chkblock_info = $scraper->getPartialBlock('javascript', '"', 0);
if (trim($chkblock_info[0], "' ', \"") == ':;' || preg_match('/^(:void)/i', trim($chkblock_info[0], "' ', \""))) {
$block_info = $scraper->getPartialBlock('\'', '\'', 0);
if (($wo_pos = mb_strpos(strtolower($links[$i]['info']), 'window.open', $backup_pos, $this->_encoding)) !== FALSE) {
$scraper->setString($links[$i]['info']);
$block_info = $scraper->getPartialBlock('\'', '\'', $wo_pos);
$scraper->setString($links[$i]['info']);
if (($oc_pos = mb_strpos(strtolower($links[$i]['info']), 'onclick', 0, $this->_encoding)) !== FALSE) { // onClickでリンク先指定の場合
$chkblock_info = $scraper->getPartialBlock('=', ')', $oc_pos);
$block_info = $scraper->getPartialBlock('\'', '\'', $oc_pos);
$links[$i]['url'] = $block_info[0];
$title = trim($scraper->getRemoveTags(TRUE));
$links[$i]['title'] = $title;
$links[$i]['title'] = NULL;
$links[$i]['url'] = NULL;
$links[$i]['title'] = NULL;
$links[$i]['url'] = NULL;
$links[$i]['title'] = NULL;
$links[$i]['url'] = NULL;
$links[$i]['title'] = NULL;
$links[$i]['url'] = $block_info[0];
$title = trim($scraper->getRemoveTags(TRUE));
if (empty($title) || $title == ' ') {
$block_info = $scraper->getPartialBlock('alt="', '"', 0);
$block_info = $scraper->getPartialBlock('alt=\'', '\'', 0);
$block_info = $scraper->getPartialBlock('alt = "', '"', 0);
$block_info = $scraper->getPartialBlock('alt = \'', '\'', 0);
$block_info = $scraper->getPartialBlock('title="', '"', 0);
$block_info = $scraper->getPartialBlock('title=\'', '\'', 0);
$block_info = $scraper->getPartialBlock('title = "', '"', 0);
$block_info = $scraper->getPartialBlock('title = \'', '\'', 0);
$links[$i]['title'] = $title;
$links[$i]['url'] = NULL;
$links[$i]['url'] = NULL;
if (($href_pos = strpos(strtolower($links[$i]['info']), 'href', 0)) !== FALSE) {
$block_info = $scraper->getPartialBlock('"', '"', $href_pos);
$block_info = $scraper->getPartialBlock('\'', '\'', $href_pos);
$block_info = $scraper->getPartialBlock('=', ' ', $href_pos);
$links[$i]['url'] = $block_info[0];
$block_info = $scraper->getPartialBlock('alt="', '"', 0);
$block_info = $scraper->getPartialBlock('alt=\'', '\'', 0);
$block_info = $scraper->getPartialBlock('alt = "', '"', 0);
$block_info = $scraper->getPartialBlock('alt = \'', '\'', 0);
$links[$i]['title'] = $block_info[0];
$links[$i]['url'] = NULL;
$links[$i]['url'] = NULL;
$block_info = $scraper->getPartialBlock('location=\'', '\'', 0);
if (($wo_pos = mb_strpos(strtolower($links[$i]['info']), 'window.open', 0, $this->_encoding)) !== FALSE) {
$scraper->setString($links[$i]['info']);
$block_info = $scraper->getPartialBlock('\'', '\'', $wo_pos);
$links[$i]['url'] = $block_info[0];
$block_info = $scraper->getPartialBlock('"', '"', 0);
$scraper->setString($block_info[0]);
$links[$i]['title'] = $scraper->getRemoveTags();
$links[$i]['url'] = NULL;
$block_info = $scraper->getPartialBlock('\'', '\'', 0);
$tmp_title = $block_info[0];
$block_info = $scraper->getPartialBlock('\'', '\'', $block_info[1]);
$links[$i]['url'] = $block_info[0];
$links[$i]['title'] = $tmp_title;
$links[$i]['url'] = NULL;
$block_info = $scraper->getPartialBlock('\'', '\'', 0);
$tmp_title = $block_info[0];
$block_info = $scraper->getPartialBlock('\'', '\'', $block_info[1]);
$block_info = $scraper->getPartialBlock('\'', '\'', $block_info[1]);
$links[$i]['url'] = $block_info[0];
$links[$i]['title'] = $tmp_title;
$links[$i]['url'] = NULL;
$links[$i]['url'] = NULL;
for ($i = 0; $i < $info_count; $i++ ) {
$rLinks[$rLinks_idx]['info'] = $links[$i]['info'];
$rLinks[$rLinks_idx]['url'] = $links[$i]['url'];
$rLinks[$rLinks_idx]['absurl'] = $links[$i]['absurl'];
$rLinks[$rLinks_idx]['title'] = $links[$i]['title'];
* getListOfLinks()で得られたリンク情報のうち,指定キーワードに関わるリンク情報の取得
* <p>指定キーワードに対する検索において,大文字・小文字の区別はしない</p>
* @param array $pLinks getListOfLinks()の返り値配列
* @param array $pTargetKey 対象キーワードの配列
* @param array $pExceptKey 除外キーワードの配列
* @return array 以下のキーをもつ関連リンク情報の配列
* <li>absurl - 絶対URL</li>
* <li>title - リンクを説明する文字列</li>
$rRelatedLinks = array();
if (($link_num = count($pLinks)) > 0 && ($targetKey_num = count($pTargetKey)) > 0) {
for ($i = 0; $i < $targetKey_num; $i++ ) {
for($j = 0; $j < $link_num; $j++ ) {
if ($targetKey_pos_in_url !== FALSE || $targetKey_pos_in_title !== FALSE) {
if (!empty($pExceptKey)) {
for ($k = 0; $k < count($pExceptKey); $k++ ) {
if ($exceptKey_pos_in_url !== FALSE || $exceptKey_pos_in_title !== FALSE) {
$absURL[$j] = $pLinks[$j]['absurl'];
$title[$j] = $pLinks[$j]['title'];
$absURL[$j] = $pLinks[$j]['absurl'];
$title[$j] = $pLinks[$j]['title'];
while ($abs_url !== FALSE) {
$absURLseq[$abs_url_idx] = $abs_url;
$abs_url = next($absURL);
while ($title_string !== FALSE) {
$title_seq[$title_string_idx] = $title_string;
$title_string = next($title);
$absURLseq_num = count($absURLseq);
if ($absURLseq_num > 1) {
for ($i = 0; $i < $absURLseq_num; $i++ ) {
for ($j = $i + 1; $j < $absURLseq_num; $j++ ) {
if (strcmp($absURLseq[$i], $absURLseq[$j]) == 0) { // URL文字列が全く同じ場合
if (mb_strlen($title_seq[$j], $this->_encoding) > mb_strlen($title_seq[$i], $this->_encoding)) {
$title_seq[$i] = $title_seq[$j];
if (preg_match("/^(index\.)/i", basename($absURLseq[$i]))) { // $absURLseq[$i] : "index.*" で終わる場合
if (preg_match("/^(index\.)/i", basename($absURLseq[$j]))) { // $absURLseq[$j] : "index.*" で終わる場合
} else { // $absURLseq[$j] : "index.*"で終わらない場合
if (mb_strlen($title_seq[$j], $this->_encoding) > mb_strlen($title_seq[$i], $this->_encoding)) {
$title_seq[$i] = $title_seq[$j];
} elseif (preg_match("/^(index\.)/i", basename($absURLseq[$j]))) { // $absURLseq[$j] : "index.*" で終わる場合
if (preg_match("/^(index\.)/i", basename($absURLseq[$i]))) { // $absURLseq[$i] : "index.*" で終わる場合
} else { // $absURLseq[$i] : "index.*" で終わらない場合
if (mb_strlen($title_seq[$j], $this->_encoding) > mb_strlen($title_seq[$i], $this->_encoding)) {
$title_seq[$i] = $title_seq[$j];
} elseif (preg_match("/\/$/", $absURLseq[$i])) { // $absURLseq[$i] : "/" で終わる場合
if (preg_match("/\/$/", $absURLseq[$j])) { // $absURLseq[$j] : "/" で終わる場合
} else { // $absURLseq[$j] : "/" で終わらない場合
if (strcmp($absURLseq[$i], $absURLseq[$j] . '/') == 0) {
if (mb_strlen($title_seq[$j], $this->_encoding) > mb_strlen($title_seq[$i], $this->_encoding)) {
$title_seq[$i] = $title_seq[$j];
} elseif (preg_match("/\/$/", $absURLseq[$j])) { // $absURLseq[$j] : "/" で終わる場合
if (preg_match("/\/$/", $absURLseq[$i])) { // $absURLseq[$i] : "/" で終わる場合
} else { // $absURLseq[$i] : "/" で終わらない場合
if (strcmp($absURLseq[$j], $absURLseq[$i] . '/') == 0) {
if (mb_strlen($title_seq[$j], $this->_encoding) > mb_strlen($title_seq[$i], $this->_encoding)) {
$title_seq[$i] = $title_seq[$j];
for ($i= 0; $i < $absURLseq_num; $i++ ) {
$rRelatedLinks[$uniqueLink_idx]['absurl'] = $absURLseq[$i];
$rRelatedLinks[$uniqueLink_idx]['title'] = $title_seq[$i];
* コンテンツ文字列からの外部スクリプトファイルのリンク情報を取得
* <p>コンテンツ文字列が正規化されていない場合には,正規化を行う</p>
* @param string $pURL コンテンツ文字列を取得したURL
* @return array 以下のキーをもつ関連リンク情報の配列
* <li>info - "<scrtipt "から"</script>"の間の文字列</li>
* <li>url - hrefに指定されているURL</li>
* <li>absurl - hrefに指定されているURLを絶対URLに変換したもの</li>
if (($s_pos = mb_strpos(strtolower($block_info[0]), '<script ', 0, $this->_encoding)) !== FALSE) {
$links[$links_idx]['info'] = mb_substr($block_info[0], 0, $s_pos , $this->_encoding);
$links[$links_idx]['info'] = mb_substr($block_info[0], $s_pos + 8 , mb_strlen($block_info[0], $this->_encoding) - ($s_pos + 8), $this->_encoding);
$links[$links_idx]['info'] = $block_info[0];
$block_info = $this->getPartialBlock('<script ', '</script>', $block_info[1]);
$info_count = count($links);
for ($i = 0; $i < $info_count; $i++ ) {
$scraper->setString($links[$i]['info']);
$block_info = $scraper->getPartialBlock('src="', '"', 0);
$links[$i]['url'] = $block_info[0];
$links[$i]['url'] = NULL;
for ($i = 0; $i < $info_count; $i++ ) {
$rLinks[$rLinks_idx] = $links[$i];
* コンテンツ文字列からのタグ部分("<"と">"で挟まれる部分)をすべて除いた文字列の取得
* <p>コンテンツ文字列が正規化されていない場合には,正規化を行う</p>
* <li>処理対象コンテンツ文字列が元々タグ内のある文字から開始されたものである場合 : TRUE</li>
* @return string タグ部分が除かれた文字列(空文字列の場合はNULLを返す)
$string_length = strlen($string);
$lt_pos = mb_strpos($string, '<', 0, $this->_encoding);
$gt_pos = mb_strpos($string, '>', 0, $this->_encoding);
if ($lt_pos !== FALSE && $gt_pos !== FALSE) {
} elseif ($lt_pos !== FALSE && $gt_pos === FALSE) {
} elseif ($lt_pos === FALSE && $gt_pos !== FALSE) {
return $rString = $string;
for ($i = 0; $i < $string_length; $i++ ) {
if ($string{$i} != '<' && $string{$i} != '>') {
$tmpString .= $string{$i};
} elseif ($string{$i} == '<') {
* コンテンツ文字列からのHTMLのコメント部分をすべて除いた文字列の取得
* <p>コンテンツ文字列が正規化されていない場合には,正規化を行う</p>
* @return string HTMLコメント部分が除かれた文字列(空文字列の場合はNULLを返す)
$string_length = strlen($string);
$c_bgn_pos = strpos($string, '<!--', 0);
while ($c_bgn_pos !== FALSE) {
if ($c_bgn_pos > $c_end_pos + 3) {
$rString .= substr($string, $c_end_pos + 3, $c_bgn_pos - ($c_end_pos + 3));
$pre_c_end_pos = $c_end_pos;
$c_end_pos = strpos($string, '-->', $c_bgn_pos + 4);
if ($c_end_pos !== FALSE) {
$c_bgn_pos = strpos($string, '<!--', $c_end_pos + 3);
$lt_pos = strpos($string, '<', $c_bgn_pos + 4);
$c_end_pos = $lt_pos - 1;
$c_bgn_pos = strpos($string, '<!--', $c_end_pos);
$rString .= substr($string, $c_end_pos + 3, $string_length - ($c_end_pos + 3));
} elseif ($rString == " ") {
* コンテンツ文字列からのHTMLのコメント部分のみの文字列の取得
* <p>コンテンツ文字列が正規化されていない場合には,正規化を行う</p>
* @return string HTMLコメント部分文字列(空文字列の場合はNULLを返す)
$string_length = strlen($string);
$rString .= $block_info[0];
* コンテンツ文字列からの指定タグ要素("<tag_name"と"</tag_name>"で挟まれる部分)文字列の取得
* <p>コンテンツ文字列が正規化されていない場合には,正規化を行う<br/>
* tag_nameの大文字・小文字の区別はしない</p>
* @param string $pTag タグ名文字列
* @return string 指定タグの要素である文字列(指定タグ見つからない場合はNULL)
$end_tag_pos = mb_strpos(strtolower($string), '</' . $pTag . '>', $start_tag_pos, $this->_encoding);
if ($start_tag_pos > mb_strlen($pTag, $this->_encoding) && $end_tag_pos > $start_tag_pos) {
$rElement = trim(mb_substr($string, $start_tag_pos, $end_tag_pos - $start_tag_pos, $this->_encoding));
* コンテンツ文字列から2つの指定文字列で挟まれる部分の抽出
* <p>すべて1バイト文字として扱う点に注意<br/>
* コンテンツ文字列が正規化されていない場合には,正規化を行う<br/>
* 指定文字列に対する抽出において,大文字・小文字の区別はしない</p>
* @param string $pString 抽出元文字列
* @param string $pStart 抽出開始部分を決めるための文字列(NULLの場合は,抽出元文字列の1文字目から抽出対象となる)
* @param string $pEnd 抽出終了部分を決めるための文字列(NULLの場合は,抽出元文字列の最終文字までが抽出対象となる)
* @param integer $pOffset 抽出元文字列のうち抽出開始対象とする位置を指定する(0オリジン)
* @return string 抽出された文字列(該当する抽出箇所がない場合 : NULL)
function _getPartialBlock($pString, $pStart, $pEnd, $pOffset) {
$pString_length = strlen($pString);
if (0< $pOffset && $pOffset < $pString_length){
$pString = substr($pString, $pOffset, $pString_length - $pOffset);
} elseif ($pOffset <= 0) {
$start_length = strlen($pStart);
if ($start_pos === FALSE) {
$start_pos = $start_pos + $start_length;
if ($end_pos > $start_pos) {
$rBlock = trim(substr($pString, $start_pos, $end_pos - $start_pos));
* This Program is distributed under version 1.0 of the Rinza Public
* License Agreement, that is bundled with this package in the file
* LICENSE, and is available through the website at the following URL:
* http://www.tyzoh.jp/rinza/licenses/LICENSE-1.0.txt.
* This is the Original Program.
* The Initial Developer of the Original Program is Nihon Unisys, Ltd.
* The Original Program is copyrighted (C) 2006-2007 by Nihon Unisys, Ltd. with
* There is NO WARRANTY OF ANY KIND by the Initial Developer of the
|