Rinza_IE
[ class tree: Rinza_IE ] [ index: Rinza_IE ] [ all elements ]

Source for file Scraper.php

Documentation is available at Scraper.php

  1. <?php
  2.  
  3. /**
  4.  * Rinza/IE/Scraper.php
  5.  * 
  6.  * <p>指定したコンテンツ文字列の正規化および正規化した文字列からの特定の情報を<br/>
  7.  * 抽出する手段を提供するクラスを定義しています。</p>
  8.  * @author Y. Kurei
  9.  * @copyright Copyright (c) 2006-2007, Nihon Unisys, Ltd.
  10.  * @version 1.1.4
  11.  * @package Rinza_IE
  12.  * @see Rinza_IE_Util
  13.  * @filesource
  14.  * @license http://www.tyzoh.jp/rinza/licenses/LICENSE-1.0.txt Rinza Public License
  15.  * @example examples/sample.php
  16.  */
  17.  
  18.  
  19. require_once 'Rinza/IE/Util.php'
  20.  
  21.  
  22. /**#@+
  23.  * 定数
  24.  */
  25. /**
  26.  * <a>タグ指定リンク情報取得のためのScraper::getListOfLinks()用オプション
  27.  */
  28. define('RINZA_IE_SCRAPER_LINK_INFO_A'11);
  29. /**
  30.  * <area>タグ指定リンク情報取得のためのScraper::getListOfLinks()用オプション
  31.  */
  32. define('RINZA_IE_SCRAPER_LINK_INFO_AREA'12);
  33. /**
  34.  * addMenuItem()指定リンク情報取得のためのScraper::getListOfLinks()用オプション
  35.  */
  36. define('RINZA_IE_SCRAPER_LINK_INFO_MENU'21);
  37. /**
  38.  * 上記すべてのリンク情報取得のためのScraper::getListOfLinks()用オプション
  39.  */
  40.  define('RINZA_IE_SCRAPER_LINK_INFO_ZALL'99);
  41. /**#@-*/
  42.  
  43.  
  44. /**
  45.  * Rinza_IE_Scraper Class
  46.  * 
  47.  * <p>指定したコンテンツ文字列の正規化および正規化した文字列から特定の情報を抽出する
  48.  * 手段を提供します。
  49.  * <ul>
  50.  *   <li>指定された2つの文字列に挟まれる部分の抽出</li>
  51.  *   <li>リンク情報の抽出</li>
  52.  *   <li>指定キーワードに関連するリンク情報の抽出</li>
  53.  *   <li>HTMLタグ部分を取り除いた文字列の抽出</li>
  54.  *   <li>HTMLコメント部分を取り除いた文字列の抽出</li>
  55.  *   <li>HTMLコメント部分の抽出</li>
  56.  *   <li>指定HTMLタグ要素の抽出</li>
  57.  * </ul>
  58.  * 等をサポートしています。</p>
  59.  * <p>使用例:
  60.  * <code>
  61.  * $s = & new Rinza_IE_Scraper($web_content_string);
  62.  * echo htmlspecialchars($s->getNormarizedString());
  63.  * 
  64.  * </code></p>
  65.  * @author Y. Kurei
  66.  * @package Rinza_IE
  67.  */ 
  68.  
  69.     /**
  70.      * オブジェクト生成時に指定されたコンテンツ文字列
  71.      * @access private
  72.      * @var string 
  73.      */
  74.     var $_origin_string;
  75.     /**
  76.      * オブジェクト生成時に指定されたコンテンツ文字列の長さ
  77.      * @access private
  78.      * @var integer 
  79.      */
  80.     var $_origin_stirng_length;
  81.     /**
  82.      * 正規化されたコンテンツ文字列
  83.      * @access private
  84.      * @var string 
  85.      */
  86.     var $_normarized_string;
  87.     /**
  88.      * 正規化されたコンテンツ文字列の長さ
  89.      * @access private
  90.      * @var integer 
  91.      */
  92.     var $_normarized_string_length;
  93.     /**
  94.      * コンテンツ文字列処理時の文字エンコーディング
  95.      * @access private
  96.      * @var string 
  97.      */
  98.     var $_encoding;
  99.     /** コンテンツ文字列中のhtml開始・終了タグ間を処理対象とするか否かのフラグ
  100.      * @access private
  101.      * @var boolean 
  102.      */
  103.     var $_html_range;
  104.     /** コンテンツ文字列中のhtml開始タグの位置
  105.      * @access private
  106.      * @var integer 
  107.      */
  108.     var $_html_begin;
  109.     /** コンテンツ文字列中のhtml終了タグの位置
  110.      * @access private
  111.      * @var integer 
  112.      */
  113.     var $_html_end;
  114.     
  115.     /**
  116.      * コンストラクタ
  117.      * 
  118.      * オブジェクトの設定
  119.      * @param  string $pString    コンテンツ文字列(既定値:NULL)
  120.      * @param  string $pEncoding  文字列処理時の文字エンコーディング(既定値:UTF-8)
  121.      * @access  public
  122.      */
  123.     function __construct($pString NULL$pEncoding 'UTF-8'$pHtmlRange TRUE{
  124.         
  125.         $this->_encoding $pEncoding;
  126.         $this->_html_range $pHtmlRange;
  127.         
  128.         if (is_null($pString)) {
  129.             $this->_origin_string $pString;
  130.             $this->_origin_stirng_length 0;
  131.         else {
  132.             $detect_encoding mb_detect_encoding($pString'ASCII,JIS,UTF-8,EUC-JP,SJIS');
  133.             if (empty($detect_encoding)) {
  134.                 $block $this->_getPartialBlock($pString'charset=''"'0);
  135.                 if (is_null($block)) {
  136.                     $this->_origin_string mb_convert_encoding($pString$pEncoding'SJIS');
  137.                 else {
  138.                     $this->_origin_string mb_convert_encoding($pString$pEncoding$block);
  139.                 }
  140.             else {
  141.                 $this->_origin_string mb_convert_encoding($pString$pEncoding$detect_encoding);
  142.             }
  143.             
  144.             $this->_origin_stirng_length mb_strlen($this->_origin_string$pEncoding);
  145.         }
  146.         $this->_normarized_string NULL;
  147.         $this->_normarized_string_length 0;
  148.         
  149.     }
  150.     
  151.     
  152.     /**
  153.      * Scraperが処理するコンテンツ文字列の(変更)設定
  154.      * 
  155.      * @param  string $pString  コンテンツ文字列(既定値:NULL)
  156.      * @access  public
  157.      */
  158.     function setString($pString NULL{
  159.         
  160.         $this->__construct($pString);
  161.         
  162.     }
  163.     
  164.     
  165.     /**
  166.      * Scraperが現在処理対象としているコンテンツ文字列の取得
  167.      * 
  168.      * @return  string  Scraperが現在処理対象としているコンテンツ文字列
  169.      * @access  public
  170.      */
  171.     function getString({
  172.         
  173.         return $this->_origin_string;
  174.         
  175.     }
  176.     
  177.     
  178.     /**
  179.      * Scraperに渡されているコンテンツ文字列の正規化文字列の取得
  180.      * 
  181.      * <p>正規化:コンテンツ文字列に含まれる次のコードを空白1文字に変換<br/>
  182.      *   <ul>
  183.      *     <li>HT(09)</li>
  184.      *     <li>LF(10)</li>
  185.      *     <li>CR(13)</li>
  186.      *     <li>連続する半角空白</li>
  187.      *   </ul>
  188.      * </p>
  189.      * @return  string  正規化されたコンテンツ文字列
  190.      * @access  public
  191.      */
  192.     function getNormarizedString({
  193.         
  194.         // 既に正規化されている場合
  195.         if (!is_null($this->_normarized_string)) {
  196.             return $this->_normarized_string;
  197.         }
  198.         
  199.         // 正規化されていない場合
  200.         $replace_char array(chr(9)chr(10)chr(13))// chr(9)= HT, chr(10)=LF, chr(13)=CR
  201.         $converted_string str_replace($replace_charchr(32)$this->_origin_string)// chr(32)=" ";
  202.         while (strpos($converted_stringstr_repeat(chr(32)2)0!== FALSE{
  203.             $converted_string str_replace(str_repeat(chr(32)2)chr(32)$converted_string);
  204.         }
  205.         $this->_normarized_string trim($converted_string);
  206.         $this->_normarized_string_length mb_strlen($this->_normarized_string$this->_encoding);
  207.         
  208.         if (!empty($this->_normarized_string&& $this->_html_range{
  209.             if (($html_bgn_pos mb_strpos(strtolower($this->_normarized_string)'<html'0$this->_encoding)) === FALSE{
  210.                 $this->_html_begin 0;
  211.             else {
  212.                 $this->_html_begin $html_bgn_pos;
  213.             }
  214.             if (($html_end_pos mb_strrpos(strtolower($this->_normarized_string)'</html>'$this->_encoding)) === FALSE{
  215.                 $this->_html_end $this->_normarized_string_length 1;
  216.             else {
  217.                 $this->_html_end $html_end_pos 6;
  218.             }
  219.             $this->_normarized_string mb_substr($this->_normarized_string$this->_html_begin$this->_html_end $this->_html_begin 1$this->_encoding);
  220.             $this->_normarized_string_length mb_strlen($this->_normarized_string$this->_encoding);
  221.         }
  222.     
  223.         return $this->_normarized_string;
  224.         
  225.     }
  226.     
  227.     
  228.     /**
  229.      * コンテンツ文字列から2つの指定文字列で挟まれる部分を抽出した文字列および抽出終了位置の取得
  230.      * 
  231.      * <p>コンテンツ文字列が正規化されていない場合には,正規化を行う<br/>
  232.      * 指定文字列に対する抽出において,大文字・小文字の区別はしない</p>
  233.      * @param   string  $pStart   抽出開始部分を決めるための文字列(NULLの場合は,抽出元文字列の1文字目から抽出対象となる)
  234.      * @param   string  $pEnd     抽出終了部分を決めるための文字列(NULLの場合は,抽出元文字列の最終文字までが抽出対象となる)
  235.      * @param   integer $pOffset  抽出元文字列のうち抽出開始対象とする位置を指定する(0オリジン)
  236.      * @return  array   次をキーをもつ配列:
  237.      *  <ul>
  238.      *     <li>0  -  抽出された文字列(該当する抽出箇所がない,あるいは空白文字のみの場合 : NULL)</li>
  239.      *     <li>1  -  抽出元文字列における抽出終了位置</li>
  240.      *  </ul>
  241.      * @access  public
  242.      */
  243.     function getPartialBlock($pStart$pEnd$pOffset{
  244.     
  245.         $rBlock array();
  246.         $block NULL;
  247.         $string $this->getNormarizedString();
  248.         $time_limit intval(mb_strlen($string$this->_encoding5000060;
  249.         if ($time_limit {
  250.             set_time_limit($time_limit);
  251.         }        
  252.         if (0$pOffset && $pOffset $this->_normarized_string_length 1){
  253.             $string mb_substr($string$pOffset$this->_normarized_string_length $pOffset$this->_encoding);
  254.         elseif ($pOffset <= 0{
  255.             $pOffset 0;
  256.         else {
  257.             return $rBlock array($block$pOffset);
  258.         }
  259.         if (is_null($pStart)) {
  260.             $start_pos 0;
  261.             $start_length 0;
  262.         else {
  263.             $start_pos mb_strpos(strtolower($string)strtolower($pStart)0$this->_encoding);
  264.             $start_length =mb_strlen($pStart$this->_encoding);
  265.         }
  266.         if ($start_pos === FALSE{
  267.             return $rBlock array($block$pOffset);
  268.         }
  269.         $start_pos $start_pos $start_length;
  270.         if (is_null($pEnd)) {
  271.             $end_pos mb_strlen($string$this->_encoding);
  272.             $end_length 0;
  273.         else {
  274.             $end_pos mb_strpos(strtolower($string)strtolower($pEnd)$start_pos$this->_encoding);
  275.             if ($end_pos === FALSE{
  276.                 return $rBlock array($block$pOffset);
  277.             }
  278.             $end_length =mb_strlen($pEnd$this->_encoding);
  279.         }
  280.         
  281.         if ($end_pos $start_pos{
  282.             $block trim(mb_substr($string$start_pos$end_pos $start_pos$this->_encoding));
  283.         }
  284.         
  285.         if (preg_match("/^([\s]+)$/"$block)) {
  286.             $block NULL;
  287.         }
  288.         
  289.         return $rBlock array($block$pOffset $end_pos $end_length);
  290.     
  291.     }
  292.     
  293.     
  294.     /**
  295.      * コンテンツ文字列からのすべてのリンク情報の取得
  296.      * 
  297.      * <p>コンテンツ文字列が正規化されていない場合には,正規化を行う</p>
  298.      * @param  string  $pURL  コンテンツ文字列を取得したURL(既定値:NULL)
  299.      * @param  integer $pOpt  対象とするリンク情報
  300.      *  <ul>
  301.      *    <li>RINZA_IE_SCRAPER_LINK_INFO_A     -  "<a>タグ"を対象(既定値)</li>
  302.      *    <li>RINZA_IE_SCRAPER_LINK_INFO_AREA  -  "<area>タグ"を対象</li>
  303.      *    <li>RINZA_IE_SCRAPER_LINK_INFO_MENU  -  "JavaScript addMenuItem()"を対象</li>
  304.      *    <li>RINZA_IE_SCRAPER_LINK_INFO_ZALL  -  上記すべてを対象</li>
  305.      *  </ul>
  306.      * @return array  対象リンク情報のすべてを格納した以下のキーをもつ配列
  307.      *  <ul>
  308.      *    <li>info  -  <ul>
  309.      *        <li>RINZA_IE_SCRAPER_LINK_INFO_Aの場合     :  "<a "から"</a>"の間の文字列</li>
  310.      *        <li>RINZA_IE_SCRAPER_LINK_INFO_AREAの場合  :  "<area "から">"の間の文字列</li>
  311.      *        <li>RINZA_IE_SCRAPER_LINK_INFO_MENUの場合  :  "addMenuItem("から")"の間の文字列</li>
  312.      *        <li>RINZA_IE_SCRAPER_LINK_INFO_ZALLの場合  :  上記すべて</li>
  313.      *      </ul>
  314.      *    </li>
  315.      *    <li>url  -  <ul>
  316.      *        <li>RINZA_IE_SCRAPER_LINK_INFO_Aの場合     :  hrefあるいはwindow.open()に指定されているURL</li>
  317.      *        <li>RINZA_IE_SCRAPER_LINK_INFO_AREAの場合  :  hrefに指定されているURL</li>
  318.      *        <li>RINZA_IE_SCRAPER_LINK_INFO_MENUの場合  :  locationに指定されているURL</li>
  319.      *        <li>RINZA_IE_SCRAPER_LINK_INFO_ZALLの場合  :  上記すべて</li>
  320.      *      </ul>
  321.      *    </li>
  322.      *    <li>absurl  -  <ul>
  323.      *        <li>RINZA_IE_SCRAPER_LINK_INFO_Aの場合     :  hrefあるいはwindow.open()に指定されているURLを絶対URLに変換したもの</li>
  324.      *        <li>RINZA_IE_SCRAPER_LINK_INFO_AREAの場合  :  hrefに指定されているURLを絶対URLに変換したもの</li>
  325.      *        <li>RINZA_IE_SCRAPER_LINK_INFO_MENUの場合  :  locationに指定されているURLを絶対URLに変換したもの</li>
  326.      *        <li>RINZA_IE_SCRAPER_LINK_INFO_ZALLの場合  :  上記すべて</li>
  327.      *      </ul>
  328.      *    </li>
  329.      *    <li>title  -  リンクを説明する文字列</li>
  330.      *  </ul>
  331.      * @access  public
  332.      */
  333.     function getListOfLinks($pURL NULL$pOpt RINZA_IE_SCRAPER_LINK_INFO_A{
  334.             
  335.         $links array();
  336.         $rLinks array();
  337.         
  338.         // <a>タグからのリンク情報取得
  339.         if ($pOpt == RINZA_IE_SCRAPER_LINK_INFO_A || $pOpt == RINZA_IE_SCRAPER_LINK_INFO_ZALL{
  340.             $block_info $this->getPartialBlock('<a ''</a>'0);
  341.             $links_idx 0;
  342.             while (!is_null($block_info[0])) {
  343.                 if (($a_pos mb_strpos(strtolower($block_info[0])'<a '0$this->_encoding)) !== FALSE{
  344.                     $links[$links_idx]['info'mb_substr($block_info[0]0$a_pos $this->_encoding);
  345.                     $links[$links_idx]['opt'RINZA_IE_SCRAPER_LINK_INFO_A;
  346.                     $links_idx++;
  347.                     $block_info[1$block_info[1(mb_strlen($block_info[0]$this->_encoding$a_pos4;
  348.                 else {
  349.                     $links[$links_idx]['info'$block_info[0];
  350.                     $links[$links_idx]['opt'RINZA_IE_SCRAPER_LINK_INFO_A;
  351.                     $links_idx++;
  352.                 }
  353.                 $block_info $this->getPartialBlock('<a ''</a>'$block_info[1]);
  354.             }
  355.         }
  356.         
  357.         $info_count count($links);
  358.         
  359.         // <area>タグからのリンク情報取得
  360.         if ($pOpt == RINZA_IE_SCRAPER_LINK_INFO_AREA || $pOpt == RINZA_IE_SCRAPER_LINK_INFO_ZALL{
  361.             $block_info $this->getPartialBlock('<area ''>',0);
  362.             $links_idx $info_count;
  363.             while (!is_null($block_info[0])) {
  364.                 $links[$links_idx]['info'$block_info[0];
  365.                 $links[$links_idx]['opt'RINZA_IE_SCRAPER_LINK_INFO_AREA;
  366.                 $links_idx++;
  367.                 $block_info $this->getPartialBlock('<area ''>'$block_info[1]);
  368.             }
  369.         }
  370.         
  371.         $info_count count($links);
  372.  
  373.         // JavaScript addMenuItem()のリンク情報取得
  374.         if ($pOpt == RINZA_IE_SCRAPER_LINK_INFO_MENU || $pOpt == RINZA_IE_SCRAPER_LINK_INFO_ZALL{
  375.             $block_info $this->getPartialBlock('addMenuItem('')'0);
  376.             $links_idx $info_count;
  377.             while (!is_null($block_info[0])) {
  378.                 $links[$links_idx]['info'$block_info[0];
  379.                 $links[$links_idx]['opt'RINZA_IE_SCRAPER_LINK_INFO_MENU 10;
  380.                 $links_idx++;
  381.                 $block_info $this->getPartialBlock('addMenuItem('')'$block_info[1]);
  382.             }
  383.             // proprietary function additem()のリンク情報取得
  384.             $block_info $this->getPartialBlock('additem('')'0);
  385.             while (!is_null($block_info[0])) {
  386.                 $links[$links_idx]['info'$block_info[0];
  387.                 if (strpos(strtolower($block_info[0])'new treenode'0!== FALSE{
  388.                     $links[$links_idx]['opt'RINZA_IE_SCRAPER_LINK_INFO_MENU 10 2;
  389.                 else {
  390.                     $links[$links_idx]['opt'RINZA_IE_SCRAPER_LINK_INFO_MENU 10 1;
  391.                 }
  392.                 $links_idx++;
  393.                 $block_info $this->getPartialBlock('additem('')'$block_info[1]);
  394.             }
  395.         }
  396.         
  397.         $info_count count($links);
  398.         
  399.         // リンク情報詳細取得
  400.         if ($info_count == 0{
  401.             return $rLinks $links;
  402.         }
  403.         $scraper new Rinza_IE_Scraper(NULL$this->_encoding);
  404.         for ($i 0$i $info_count$i++{
  405.             $scraper->setString($links[$i]['info']);
  406.             if ($links[$i]['opt'== RINZA_IE_SCRAPER_LINK_INFO_A// <a>タグからのリンク情報詳細取得
  407.                 if (($href_pos mb_strpos(strtolower($links[$i]['info'])'href'0$this->_encoding)) !== FALSE{
  408.                     $eq_pos mb_strpos($links[$i]['info']'='$href_pos$this->_encoding);
  409.                     $gt_pos mb_strpos($links[$i]['info']'>'$href_pos$this->_encoding);
  410. //                    $js_pos = mb_strpos(strtolower($links[$i]['info']), 'javascript', $href_pos, $this->_encoding);
  411.                     $js_chkblock_info $scraper->getPartialBlock('=''>'$href_pos);
  412.                     $js_flg preg_match('/^(href=javascript)/i'trim(strtolower($js_chkblock_info[0])"\", ', ' '"));
  413.                     if (($sp_pos mb_strpos($links[$i]['info']' '$href_pos$this->_encoding)) === FALSE{
  414.                         $sp_pos $gt_pos 1;
  415.                     else {
  416.                         if ($sp_pos $eq_pos{
  417.                             if (($sp_pos mb_strpos($links[$i]['info']' '$eq_pos$this->_encoding)) === FALSE{
  418.                                 $sp_pos $gt_pos 1;
  419.                             }
  420.                         else {
  421.                             $chk_space trim(mb_substr($links[$i]['info']$eq_pos 1$sp_pos $eq_pos$this->_encoding)' ');
  422.                             if (empty($chk_space)) {
  423.                                 $sp_pos $gt_pos 1;
  424.                             else {
  425.                             }
  426.                         }
  427.                     }
  428.                     if ($js_flg{
  429.                         $subblock_info $scraper->getPartialBlock('=''>'$href_pos);
  430.                     elseif ($sp_pos $gt_pos{
  431.                         $subblock_info $scraper->getPartialBlock('='' '$href_pos);
  432.                     else {
  433.                         $subblock_info $scraper->getPartialBlock('=''>'$href_pos);
  434.                     }
  435.                     if (!is_null($subblock_info[0])) {
  436.                         if ($js_flg{
  437.                             $block_info[0$subblock_info[0];
  438.                             $block_info[1$href_pos mb_strlen($subblock_info[0]$this->_encoding);
  439.                         else {
  440.                             $scraper->setString($subblock_info[0]);
  441.                             $chkblock_info $scraper->getPartialBlock('"''"'$href_pos);
  442.                             if (!is_null($chkblock_info[0])) {
  443.                                 $block_info $chkblock_info;
  444.                             else {
  445.                                 $chkblock_info $scraper->getPartialBlock('\'''\''$href_pos);
  446.                                 if (!is_null($chkblock_info[0])) {
  447.                                     $block_info $chkblock_info;
  448.                                 else {
  449.                                     $block_info[0trim($subblock_info[0]'", \'');
  450.                                     $block_info[1$href_pos mb_strlen($subblock_info[0]$this->_encoding);
  451.                                 }
  452.                             }
  453.                             $scraper->setString($links[$i]['info']);
  454.                         }
  455.                     else {
  456.                         $block_info[0NULL;
  457.                         $block_info[1$href_pos;
  458.                     }
  459.                     $backup_pos $block_info[1];
  460.                     if (!is_null($block_info[0])) {
  461.                         if (strpos(strtolower($block_info[0])'javascript'0!== FALSE{
  462.                             $scraper->setString($block_info[0]);
  463.                             $chkblock_info $scraper->getPartialBlock('javascript''"'0);
  464.                             if (trim($chkblock_info[0]"' ', \""== ':;' || preg_match('/^(:void)/i'trim($chkblock_info[0]"' ', \""))) {
  465.                                 $block_info[0'#';
  466.                             else {
  467.                                 $block_info $scraper->getPartialBlock('\'''\''0);
  468.                                 if (is_null($block_info[0])) {
  469.                                     if (($wo_pos mb_strpos(strtolower($links[$i]['info'])'window.open'$backup_pos$this->_encoding)) !== FALSE{
  470.                                         $scraper->setString($links[$i]['info']);
  471.                                         $block_info $scraper->getPartialBlock('\'''\''$wo_pos);
  472.                                     }
  473.                                 }
  474.                             }
  475.                             $scraper->setString($links[$i]['info']);
  476.                         }
  477.                         if (preg_match("/^#/"$block_info[0])) {
  478.                             if (($oc_pos mb_strpos(strtolower($links[$i]['info'])'onclick'0$this->_encoding)) !== FALSE// onClickでリンク先指定の場合
  479.                                 // 'url'の取得
  480.                                 $chkblock_info $scraper->getPartialBlock('='')'$oc_pos);
  481.                                 if (mb_strpos(strtolower($chkblock_info[0])'open'0$this->_encoding!== FALSE{
  482.                                     $block_info $scraper->getPartialBlock('\'''\''$oc_pos);
  483.                                     if (!is_null($block_info[0])) {
  484.                                         $links[$i]['url'$block_info[0];
  485.                                         // 'absurl'の取得
  486.                                         $links[$i]['absurl'Rinza_IE_Util::getAbsoluteURL($pURL$links[$i]['url']);
  487.                                         // 'title'の取得
  488.                                         $title trim($scraper->getRemoveTags(TRUE));
  489.                                         if (!empty($title)) {
  490.                                             $links[$i]['title'$title;
  491.                                         else {
  492.                                             $links[$i]['title'NULL;
  493.                                         }
  494.                                     else {
  495.                                         $links[$i]['url'NULL;
  496.                                         $links[$i]['title'NULL;
  497.                                     }
  498.                                 else {
  499.                                     $links[$i]['url'NULL;
  500.                                     $links[$i]['title'NULL;
  501.                                 }
  502.                             else {
  503.                                 $links[$i]['url'NULL;
  504.                                 $links[$i]['title'NULL;
  505.                             }
  506.                         else {
  507.                             // 'url'の取得
  508.                             $links[$i]['url'$block_info[0];
  509.                             // 'absurl'の取得
  510.                             $links[$i]['absurl'Rinza_IE_Util::getAbsoluteURL($pURL$links[$i]['url']);
  511.                             // 'title'の取得
  512.                             $title trim($scraper->getRemoveTags(TRUE));
  513.                             if (empty($title|| $title == '&nbsp;'{
  514.                                 $block_info $scraper->getPartialBlock('alt="''"'0);
  515.                                 if (is_null($block_info[0])) {
  516.                                     $block_info $scraper->getPartialBlock('alt=\'''\''0);
  517.                                     if (is_null($block_info[0])) {
  518.                                         $block_info $scraper->getPartialBlock('alt = "''"'0);
  519.                                         if (is_null($block_info[0])) {
  520.                                             $block_info $scraper->getPartialBlock('alt = \'''\''0);
  521.                                             if (is_null($block_info[0])) {
  522.                                                 $block_info $scraper->getPartialBlock('title="''"'0);
  523.                                                 if (is_null($block_info[0])) {
  524.                                                     $block_info $scraper->getPartialBlock('title=\'''\''0);
  525.                                                     if (is_null($block_info[0])) {
  526.                                                         $block_info $scraper->getPartialBlock('title = "''"'0);
  527.                                                         if (is_null($block_info[0])) {
  528.                                                             $block_info $scraper->getPartialBlock('title = \'''\''0);
  529.                                                         }
  530.                                                     }
  531.                                                 }
  532.                                             }
  533.                                         }
  534.                                     }
  535.                                 }
  536.                                 $title $block_info[0];
  537.                             elseif (preg_match("/^([\s]+)$/"$title)) {
  538.                                 $title NULL;
  539.                             }
  540.                             $links[$i]['title'$title;
  541.                         }
  542.                     else {
  543.                         $links[$i]['url'NULL;
  544.                     }
  545.                 else {
  546.                     $links[$i]['url'NULL;
  547.                 }
  548.             elseif ($links[$i]['opt'== RINZA_IE_SCRAPER_LINK_INFO_AREA// <area>タグからのリンク情報詳細取得
  549.                 if (($href_pos strpos(strtolower($links[$i]['info'])'href'0)) !== FALSE{
  550.                     $block_info $scraper->getPartialBlock('"''"'$href_pos);
  551.                     if (is_null($block_info[0])) {
  552.                         $block_info $scraper->getPartialBlock('\'''\''$href_pos);
  553.                         if (is_null($block_info[0])) {
  554.                             $block_info $scraper->getPartialBlock('='' '$href_pos);
  555.                         }
  556.                     }
  557.                     if (!is_null($block_info[0])) {
  558.                         // 'url'の取得
  559.                         $links[$i]['url'$block_info[0];
  560.                         // 'absurl'の取得
  561.                         $links[$i]['absurl'Rinza_IE_Util::getAbsoluteURL($pURL$links[$i]['url']);
  562.                         // 'title'の取得
  563.                         $block_info $scraper->getPartialBlock('alt="''"'0);
  564.                         if (is_null($block_info[0])) {
  565.                             $block_info $scraper->getPartialBlock('alt=\'''\''0);
  566.                             if (is_null($block_info[0])) {
  567.                                 $block_info $scraper->getPartialBlock('alt = "''"'0);
  568.                                 if (is_null($block_info[0])) {
  569.                                     $block_info $scraper->getPartialBlock('alt = \'''\''0);
  570.                                 }
  571.                             }
  572.                         }
  573.                         $links[$i]['title'$block_info[0];
  574.                     else {
  575.                         $links[$i]['url'NULL;
  576.                     }
  577.                 else {
  578.                     $links[$i]['url'NULL;
  579.                 }
  580.             elseif ($links[$i]['opt'== (RINZA_IE_SCRAPER_LINK_INFO_MENU 10)) // JavaScript addMenuItem()からのリンク情報取得
  581.                 $block_info $scraper->getPartialBlock('location=\'''\''0);
  582.                 if (is_null($block_info[0])) {
  583.                     if (($wo_pos mb_strpos(strtolower($links[$i]['info'])'window.open'0$this->_encoding)) !== FALSE{
  584.                         $scraper->setString($links[$i]['info']);
  585.                         $block_info $scraper->getPartialBlock('\'''\''$wo_pos);
  586.                     }
  587.                 }
  588.                 if (!is_null($block_info[0])) {
  589.                     // 'url'の取得
  590.                     $links[$i]['url'$block_info[0];
  591.                     // 'absurl'の取得
  592.                     $links[$i]['absurl'Rinza_IE_Util::getAbsoluteURL($pURL$links[$i]['url']);
  593.                     // 'title'の取得
  594.                     $block_info $scraper->getPartialBlock('"''"'0);
  595.                     $scraper->setString($block_info[0]);
  596.                     $links[$i]['title'$scraper->getRemoveTags();
  597.                 else {
  598.                     $links[$i]['url'NULL;
  599.                 }
  600.             elseif ($links[$i]['opt'== (RINZA_IE_SCRAPER_LINK_INFO_MENU 10 1)) // proprietary function additem()のリンク情報取得
  601.                 $block_info $scraper->getPartialBlock('\'''\''0);
  602.                 if (!is_null($block_info[0])) {
  603.                     $tmp_title $block_info[0];
  604.                     // 'url'の取得
  605.                     $block_info $scraper->getPartialBlock('\'''\''$block_info[1]);
  606.                     $links[$i]['url'$block_info[0];
  607.                     // 'absurl'の取得
  608.                     $links[$i]['absurl'Rinza_IE_Util::getAbsoluteURL($pURL$links[$i]['url']);
  609.                     // 'title'の取得
  610.                     $links[$i]['title'$tmp_title;
  611.                 else {
  612.                     $links[$i]['url'NULL;
  613.                 }
  614.             elseif ($links[$i]['opt'== (RINZA_IE_SCRAPER_LINK_INFO_MENU 10 2)) // proprietary function additem()のリンク情報取得
  615.                 $block_info $scraper->getPartialBlock('\'''\''0);
  616.                 if (!is_null($block_info[0])) {
  617.                     $tmp_title $block_info[0];
  618.                     // 'url'の取得
  619.                     $block_info $scraper->getPartialBlock('\'''\''$block_info[1]);
  620.                     $block_info $scraper->getPartialBlock('\'''\''$block_info[1]);
  621.                     $links[$i]['url'$block_info[0];
  622.                     // 'absurl'の取得
  623.                     $links[$i]['absurl'Rinza_IE_Util::getAbsoluteURL($pURL$links[$i]['url']);
  624.                     // 'title'の取得
  625.                     $links[$i]['title'$tmp_title;
  626.                 else {
  627.                     $links[$i]['url'NULL;
  628.                 }
  629.             else {
  630.                 $links[$i]['url'NULL;
  631.             }
  632.         }
  633.         unset($scraper);
  634.         
  635.         $rLinks_idx 0;
  636.         for ($i 0$i $info_count$i++{
  637.             if (!is_null($links[$i]['url'])) {
  638.                 $rLinks[$rLinks_idx]['info'$links[$i]['info'];
  639.                 $rLinks[$rLinks_idx]['url'$links[$i]['url'];
  640.                 $rLinks[$rLinks_idx]['absurl'$links[$i]['absurl'];
  641.                 $rLinks[$rLinks_idx]['title'$links[$i]['title'];
  642.                 $rLinks_idx++;
  643.             }
  644.         }
  645.         
  646.         return $rLinks;
  647.     
  648.     }
  649.     
  650.     
  651.     /**
  652.      * getListOfLinks()で得られたリンク情報のうち,指定キーワードに関わるリンク情報の取得
  653.      * 
  654.      * <p>指定キーワードに対する検索において,大文字・小文字の区別はしない</p>
  655.      * @param   array $pLinks      getListOfLinks()の返り値配列
  656.      * @param   array $pTargetKey  対象キーワードの配列
  657.      * @param   array $pExceptKey  除外キーワードの配列
  658.      * @return  array  以下のキーをもつ関連リンク情報の配列
  659.      *  <ul>
  660.      *    <li>absurl  -  絶対URL</li>
  661.      *    <li>title   -  リンクを説明する文字列</li>
  662.      *  </ul>
  663.      * @access  public
  664.      */
  665.     function getRelatedLinks($pLinks$pTargetKey$pExceptKey{
  666.         
  667.         $rRelatedLinks array();
  668.         $absURL array();
  669.         $absURLseq array();
  670.         $title array();
  671.         
  672.         if (($link_num count($pLinks)) && ($targetKey_num count($pTargetKey)) 0{
  673.             
  674.             // 指定キーワードに関わるリンク情報を抽出
  675.             for ($i 0$i $targetKey_num$i++{
  676.                 for($j 0$j $link_num$j++{
  677.                     $targetKey_pos_in_url mb_strpos(strtolower($pLinks[$j]['url'])strtolower($pTargetKey[$i])0$this->_encoding);
  678.                     $targetKey_pos_in_title mb_strpos(strtolower($pLinks[$j]['title'])strtolower($pTargetKey[$i])0$this->_encoding);
  679.                     if ($targetKey_pos_in_url !== FALSE || $targetKey_pos_in_title !== FALSE{
  680.                         if (!empty($pExceptKey)) {
  681.                             $except_flg FALSE;
  682.                             for ($k 0$k count($pExceptKey)$k++{
  683.                                 $exceptKey_pos_in_url mb_strpos(strtolower($pLinks[$j]['url'])strtolower($pExceptKey[$k])0$this->_encoding);
  684.                                 $exceptKey_pos_in_title mb_strpos(strtolower($pLinks[$j]['title'])strtolower($pExceptKey[$k])0$this->_encoding);
  685.                                 if ($exceptKey_pos_in_url !== FALSE || $exceptKey_pos_in_title !== FALSE{
  686.                                     $except_flg TRUE;
  687.                                     break 1;
  688.                                 }
  689.                             }
  690.                             if (!$except_flg{
  691.                                 $absURL[$j$pLinks[$j]['absurl'];
  692.                                 $title[$j$pLinks[$j]['title'];
  693.                             }
  694.                         else {
  695.                             $absURL[$j$pLinks[$j]['absurl'];
  696.                             $title[$j$pLinks[$j]['title'];
  697.                         }
  698.                     }
  699.                 }
  700.             }
  701.             
  702.             if (!is_null($absURL)) {
  703.                 // リンク情報配列インデックスの圧縮
  704.                 $abs_url current($absURL);
  705.                 $abs_url_idx 0;
  706.                 while ($abs_url !== FALSE{
  707.                     $absURLseq[$abs_url_idx$abs_url;
  708.                     $abs_url_idx++;
  709.                     $abs_url next($absURL);
  710.                 }
  711.                 $title_string current($title);
  712.                 $title_string_idx 0;
  713.                 while ($title_string !== FALSE{
  714.                     $title_seq[$title_string_idx$title_string;
  715.                     $title_string_idx++;
  716.                     $title_string next($title);
  717.                 }
  718.                 
  719.                 // リンク先URLが重複している情報の削除準備
  720.                 $absURLseq_num count($absURLseq);
  721.                 if ($absURLseq_num 1{
  722.                     for ($i 0$i $absURLseq_num$i++{
  723.                         if (!is_null($absURLseq[$i])) {
  724.                             for ($j $i 1$j $absURLseq_num$j++{
  725.                                 if (strcmp($absURLseq[$i]$absURLseq[$j]== 0// URL文字列が全く同じ場合
  726.                                     $absURLseq[$jNULL;
  727.                                     if (mb_strlen($title_seq[$j]$this->_encodingmb_strlen($title_seq[$i]$this->_encoding)) {
  728.                                         $title_seq[$i$title_seq[$j];
  729.                                     }
  730.                                 else // URL文字列が異なる場合
  731.                                     if (preg_match("/^(index\.)/i"basename($absURLseq[$i]))) // $absURLseq[$i] : "index.*" で終わる場合
  732.                                         if (preg_match("/^(index\.)/i"basename($absURLseq[$j]))) // $absURLseq[$j] : "index.*" で終わる場合
  733.                                             // URL文字列は完全に異なる
  734.                                         else // $absURLseq[$j] : "index.*"で終わらない場合
  735.                                             if (strcmp(dirname($absURLseq[$i])preg_replace("/\/$/"""$absURLseq[$j])) == 0{
  736.                                                 $absURLseq[$jNULL;
  737.                                                 if (mb_strlen($title_seq[$j]$this->_encodingmb_strlen($title_seq[$i]$this->_encoding)) {
  738.                                                     $title_seq[$i$title_seq[$j];
  739.                                                 }
  740.                                             else {
  741.                                                 // URL文字列は完全に異なる
  742.                                             }
  743.                                         }
  744.                                     elseif (preg_match("/^(index\.)/i"basename($absURLseq[$j]))) // $absURLseq[$j] : "index.*" で終わる場合
  745.                                         if (preg_match("/^(index\.)/i"basename($absURLseq[$i]))) // $absURLseq[$i] : "index.*" で終わる場合
  746.                                             // URL文字列は完全に異なる
  747.                                         else // $absURLseq[$i] : "index.*" で終わらない場合
  748.                                             if (strcmp(dirname($absURLseq[$j])preg_replace("/\/$/"""$absURLseq[$i])) == 0{
  749.                                                 $absURLseq[$jNULL;
  750.                                                 if (mb_strlen($title_seq[$j]$this->_encodingmb_strlen($title_seq[$i]$this->_encoding)) {
  751.                                                     $title_seq[$i$title_seq[$j];
  752.                                                 }
  753.                                             else {
  754.                                                 // URL文字列は完全に異なる
  755.                                             }
  756.                                         }
  757.                                     elseif (preg_match("/\/$/"$absURLseq[$i])) // $absURLseq[$i] : "/" で終わる場合
  758.                                         if (preg_match("/\/$/"$absURLseq[$j])) // $absURLseq[$j] : "/" で終わる場合
  759.                                             // URL文字列は完全に異なる
  760.                                         else // $absURLseq[$j] : "/" で終わらない場合
  761.                                             if (strcmp($absURLseq[$i]$absURLseq[$j'/'== 0{
  762.                                                 $absURLseq[$jNULL;
  763.                                                 if (mb_strlen($title_seq[$j]$this->_encodingmb_strlen($title_seq[$i]$this->_encoding)) {
  764.                                                     $title_seq[$i$title_seq[$j];
  765.                                                 }
  766.                                             }
  767.                                         }
  768.                                     elseif (preg_match("/\/$/"$absURLseq[$j])) // $absURLseq[$j] : "/" で終わる場合
  769.                                         if (preg_match("/\/$/"$absURLseq[$i])) // $absURLseq[$i] : "/" で終わる場合
  770.                                             // URL文字列は完全に異なる
  771.                                         else // $absURLseq[$i] : "/" で終わらない場合
  772.                                             if (strcmp($absURLseq[$j]$absURLseq[$i'/'== 0{
  773.                                                 $absURLseq[$jNULL;
  774.                                                 if (mb_strlen($title_seq[$j]$this->_encodingmb_strlen($title_seq[$i]$this->_encoding)) {
  775.                                                     $title_seq[$i$title_seq[$j];
  776.                                                 }
  777.                                             }
  778.                                         }
  779.                                     else {
  780.                                         // URL文字列は完全に異なる
  781.                                     }    
  782.                                 }
  783.                             }
  784.                         }
  785.                     }
  786.                 }
  787.     
  788.                 // 重複のないリンク情報配列の作成
  789.                 $uniqueLink_idx 0;
  790.                 for ($i0$i $absURLseq_num$i++{
  791.                     if (!is_null($absURLseq[$i])) {
  792.                         $rRelatedLinks[$uniqueLink_idx]['absurl'$absURLseq[$i];
  793.                         $rRelatedLinks[$uniqueLink_idx]['title'$title_seq[$i];
  794.                         $uniqueLink_idx++;
  795.                     }
  796.                 }
  797.     
  798.             }
  799.         }
  800.  
  801.         return $rRelatedLinks;
  802.     
  803.     }
  804.     
  805.     
  806.     /**
  807.      * コンテンツ文字列からの外部スクリプトファイルのリンク情報を取得
  808.      * 
  809.      * <p>コンテンツ文字列が正規化されていない場合には,正規化を行う</p>
  810.      * @param  string $pURL  コンテンツ文字列を取得したURL
  811.      * @return array  以下のキーをもつ関連リンク情報の配列
  812.      *  <ul>
  813.      *    <li>info   -  "<scrtipt "から"</script>"の間の文字列</li>
  814.      *    <li>url    -  hrefに指定されているURL</li>
  815.      *    <li>absurl -  hrefに指定されているURLを絶対URLに変換したもの</li>
  816.      *  </ul>
  817.      * @access  public
  818.      */
  819.     function getListOfScriptSrc($pURL NULL{
  820.         
  821.         $links array();
  822.         $rLinks array();
  823.         
  824.         $block_info $this->getPartialBlock('<script ''</script>'0);
  825.         $links_idx 0;
  826.         while (!is_null($block_info[0])) {
  827.             if (($s_pos mb_strpos(strtolower($block_info[0])'<script '0$this->_encoding)) !== FALSE{
  828.                 $links[$links_idx]['info'mb_substr($block_info[0]0$s_pos $this->_encoding);
  829.                 $links_idx++;
  830.                 $links[$links_idx]['info'mb_substr($block_info[0]$s_pos mb_strlen($block_info[0]$this->_encoding($s_pos 8)$this->_encoding);
  831.                 $links_idx++;
  832.             else {
  833.                 $links[$links_idx]['info'$block_info[0];
  834.                 $links_idx++;
  835.             }
  836.             $block_info $this->getPartialBlock('<script ''</script>'$block_info[1]);
  837.         }
  838.         $info_count count($links);
  839.         if ($info_count == 0{
  840.             return $rLinks $links;
  841.         }
  842.         $scraper new Rinza_IE_Scraper(NULL$this->_encoding);
  843.         for ($i 0$i $info_count$i++{
  844.             $scraper->setString($links[$i]['info']);
  845.             // 'url'の取得
  846.             $block_info $scraper->getPartialBlock('src="''"'0);
  847.             if (!is_null($block_info[0])) {
  848.                 $links[$i]['url'$block_info[0];
  849.                 // 'absurl'の取得
  850.                 $links[$i]['absurl'Rinza_IE_Util::getAbsoluteURL($pURL$links[$i]['url']);
  851.             else {
  852.                 $links[$i]['url'NULL;
  853.             }
  854.         }
  855.         unset($scraper);
  856.         
  857.         $rLinks_idx 0;
  858.         for ($i 0$i $info_count$i++{
  859.             if (!is_null($links[$i]['url'])) {
  860.                 $rLinks[$rLinks_idx$links[$i];
  861.                 $rLinks_idx++;
  862.             }
  863.         }
  864.         
  865.         return $rLinks;
  866.     
  867.     }
  868.     
  869.     
  870.     /**
  871.      * コンテンツ文字列からのタグ部分("<"と">"で挟まれる部分)をすべて除いた文字列の取得
  872.      * 
  873.      * <p>コンテンツ文字列が正規化されていない場合には,正規化を行う</p>
  874.      * @param  boolean  $pInTag 
  875.      *  <ul>
  876.      *    <li>処理対象コンテンツ文字列が元々タグ内のある文字から開始されたものである場合 : TRUE</li>
  877.      *    <li>上記以外                                                                   : FALSE</li>
  878.      *  </ul>
  879.      * @return string  タグ部分が除かれた文字列(空文字列の場合はNULLを返す)
  880.      * @access  public
  881.      */    
  882.     function getRemoveTags($pInTag FALSE{
  883.     
  884.         $rString NULL;
  885.         $string $this->getNormarizedString();
  886.         $string_length strlen($string);
  887.         $lt_pos mb_strpos($string'<'0$this->_encoding);
  888.         $gt_pos mb_strpos($string'>'0$this->_encoding);
  889.         
  890.         if ($lt_pos !== FALSE && $gt_pos !== FALSE{
  891.             if ($pInTag{
  892.                 $in_tag TRUE;
  893.             else {
  894.                 if ($lt_pos $gt_pos{
  895.                     $in_tag FALSE;
  896.                 else {
  897.                     $in_tag TRUE;
  898.                 }
  899.             }
  900.         elseif ($lt_pos !== FALSE && $gt_pos === FALSE{
  901.             if ($pInTag{
  902.                 $in_tag TRUE;
  903.             else {
  904.                 $in_tag FALSE;
  905.             }
  906.         elseif ($lt_pos === FALSE && $gt_pos !== FALSE{
  907.             $in_tag TRUE;
  908.         else {
  909.             if ($pInTag{
  910.                 $in_tag TRUE;
  911.             else {
  912.                 return $rString $string;
  913.             }
  914.         }
  915.         
  916.         $tmpString NULL;
  917.         for ($i 0$i $string_length$i++{
  918.             if ($string{$i!= '<' && $string{$i!= '>'{
  919.                 if (!$in_tag{
  920.                     $tmpString .= $string{$i};
  921.                 }
  922.             elseif ($string{$i== '<'{
  923.                 if (!is_null($tmpString)) {
  924.                     $rString .= $tmpString;
  925.                 }
  926.                 $in_tag TRUE;
  927.             else {
  928.                 if (!is_null($tmpString)) {
  929.                     $tmpString NULL;
  930.                 }
  931.                 $in_tag FALSE;
  932.             }
  933.         }
  934.         if (!is_null($tmpString)) {
  935.             $rString .= $tmpString;
  936.             $tmpString NULL;
  937.         }
  938.         
  939.         if ($rString == ""{
  940.             $rString NULL;
  941.         }
  942.         
  943.         return $rString;
  944.         
  945.     }
  946.     
  947.     
  948.     /**
  949.      * コンテンツ文字列からのHTMLのコメント部分をすべて除いた文字列の取得
  950.      * 
  951.      * <p>コンテンツ文字列が正規化されていない場合には,正規化を行う</p>
  952.      * @return string  HTMLコメント部分が除かれた文字列(空文字列の場合はNULLを返す)
  953.      * @access  public
  954.      */    
  955.     function getRemoveHTMLComments({
  956.     
  957.         $rString NULL;
  958.         $string $this->getNormarizedString();
  959.         $string_length strlen($string);
  960.         $c_bgn_pos strpos($string'<!--'0);
  961.         $c_end_pos = -3;
  962.         while ($c_bgn_pos !== FALSE{
  963.             if ($c_bgn_pos $c_end_pos 3{
  964.                 $rString .= substr($string$c_end_pos 3$c_bgn_pos ($c_end_pos 3));
  965.             }
  966.             $pre_c_end_pos $c_end_pos;
  967.             $c_end_pos strpos($string'-->'$c_bgn_pos 4);
  968.             if ($c_end_pos !== FALSE{
  969.                 $c_bgn_pos strpos($string'<!--'$c_end_pos 3);
  970.             else {
  971.                 $lt_pos strpos($string'<'$c_bgn_pos 4);
  972.                 if ($lt_pos !== FALSE{
  973.                     $c_end_pos $lt_pos 1;
  974.                     $c_bgn_pos strpos($string'<!--'$c_end_pos);
  975.                 else {
  976.                     $c_bgn_pos FALSE;
  977.                 }
  978.             }
  979.         }
  980.         
  981.         $rString .= substr($string$c_end_pos 3$string_length ($c_end_pos 3));
  982.  
  983.         if (empty($rString)) {
  984.             $rString NULL;
  985.         elseif ($rString == "&nbsp;"{
  986.             $rString NULL;
  987.         elseif (preg_match("/^([\s]+)$/"$rString)) {
  988.             $rString NULL;
  989.         }
  990.         
  991.         return $rString;
  992.         
  993.     }
  994.     
  995.     
  996.     /**
  997.      * コンテンツ文字列からのHTMLのコメント部分のみの文字列の取得
  998.      * 
  999.      * <p>コンテンツ文字列が正規化されていない場合には,正規化を行う</p>
  1000.      * @return string  HTMLコメント部分文字列(空文字列の場合はNULLを返す)
  1001.      * @access  public
  1002.      */
  1003.     function getHTMLComments({
  1004.     
  1005.         $rString NULL;
  1006.         $string $this->getNormarizedString();
  1007.         $string_length strlen($string);
  1008.         
  1009.         $block_info $this->getPartialBlock('<!--''-->'0);
  1010.         while (!is_null($block_info[0])) {
  1011.             $rString .= $block_info[0];
  1012.             $block_info $this->getPartialBlock('<!--''-->'$block_info[1]);
  1013.         }
  1014.         
  1015.         return $rString;
  1016.         
  1017.     }
  1018.     
  1019.     
  1020.     /**
  1021.      * コンテンツ文字列からの指定タグ要素("<tag_name"と"</tag_name>"で挟まれる部分)文字列の取得
  1022.      * 
  1023.      * <p>コンテンツ文字列が正規化されていない場合には,正規化を行う<br/>
  1024.      * tag_nameの大文字・小文字の区別はしない</p>
  1025.      * @param  string $pTag  タグ名文字列
  1026.      * @return  string  指定タグの要素である文字列(指定タグ見つからない場合はNULL)
  1027.      * @access  public
  1028.      */    
  1029.     function getTagElement($pTag NULL{
  1030.         
  1031.         $rElement NULL;
  1032.         $string $this->getNormarizedString();
  1033.         
  1034.         if (!is_null($pTag)) {
  1035.             $pTag strtolower($pTag);
  1036.             $start_tag_pos mb_strpos(strtolower($string)'<' $pTag0$this->_encoding1;
  1037.             $end_tag_pos mb_strpos(strtolower($string)'</' $pTag '>'$start_tag_pos$this->_encoding);
  1038.             if ($start_tag_pos mb_strlen($pTag$this->_encoding&& $end_tag_pos $start_tag_pos{
  1039.                 $rElement trim(mb_substr($string$start_tag_pos$end_tag_pos $start_tag_pos$this->_encoding));
  1040.             }
  1041.         }
  1042.         
  1043.         return $rElement;
  1044.         
  1045.     }
  1046.     
  1047.     
  1048.     /**
  1049.      * コンテンツ文字列から2つの指定文字列で挟まれる部分の抽出
  1050.      * 
  1051.      * <p>すべて1バイト文字として扱う点に注意<br/>
  1052.      * コンテンツ文字列が正規化されていない場合には,正規化を行う<br/>
  1053.      * 指定文字列に対する抽出において,大文字・小文字の区別はしない</p>
  1054.      * @param  string  $pString  抽出元文字列
  1055.      * @param  string  $pStart   抽出開始部分を決めるための文字列(NULLの場合は,抽出元文字列の1文字目から抽出対象となる)
  1056.      * @param  string  $pEnd     抽出終了部分を決めるための文字列(NULLの場合は,抽出元文字列の最終文字までが抽出対象となる)
  1057.      * @param  integer $pOffset  抽出元文字列のうち抽出開始対象とする位置を指定する(0オリジン)
  1058.      * @return string  抽出された文字列(該当する抽出箇所がない場合 : NULL)
  1059.      * @access  private
  1060.      */
  1061.     function _getPartialBlock($pString$pStart$pEnd$pOffset{
  1062.     
  1063.         $rBlock NULL;
  1064.         $pString_length strlen($pString);
  1065.         
  1066.         if (0$pOffset && $pOffset $pString_length){
  1067.             $pString substr($pString$pOffset$pString_length $pOffset);
  1068.         elseif ($pOffset <= 0{
  1069.             $pOffset 0;
  1070.         else {
  1071.             return $rBlock;
  1072.         }
  1073.         if (is_null($pStart)) {
  1074.             $start_pos 0;
  1075.             $start_length 0;
  1076.         else {
  1077.             $start_pos strpos(strtolower($pString)strtolower($pStart)0);
  1078.             $start_length =strlen($pStart);
  1079.         }
  1080.         if ($start_pos === FALSE{
  1081.             return $rBlock;
  1082.         }
  1083.         $start_pos $start_pos $start_length;
  1084.         if (is_null($pEnd)) {
  1085.             $end_pos strlen($pString);
  1086.             $end_length 0;
  1087.         else {
  1088.             $end_pos strpos(strtolower($pString)strtolower($pEnd)$start_pos);
  1089.             $end_length =strlen($pEnd);
  1090.         }
  1091.         
  1092.         if ($end_pos $start_pos{
  1093.             $rBlock trim(substr($pString$start_pos$end_pos $start_pos));
  1094.         }
  1095.         
  1096.         return $rBlock;
  1097.     
  1098.     }
  1099.     
  1100.     
  1101. }
  1102.  
  1103. /** 
  1104.  * This Program is distributed under version 1.0 of the Rinza Public
  1105.  * License Agreement, that is bundled with this package in the file
  1106.  * LICENSE, and is available through the website at the following URL:
  1107.  * http://www.tyzoh.jp/rinza/licenses/LICENSE-1.0.txt.
  1108.  * 
  1109.  * This is the Original Program.
  1110.  * The Initial Developer of the Original Program is Nihon Unisys, Ltd.
  1111.  * The Original Program is copyrighted (C) 2006-2007 by Nihon Unisys, Ltd. with
  1112.  * all rights reserved.
  1113.  * There is NO WARRANTY OF ANY KIND by the Initial Developer of the
  1114.  * Original Program.
  1115.  */
  1116.  
  1117. ?>

Documentation generated on Fri, 09 Nov 2007 14:01:38 +0900 by phpDocumentor 1.4.0