[PHP-users 21213]Re: ネストされたタグを正規表現で抽出する場

まーちゃん ma-chan @ fudou.ne.jp
2004年 4月 9日 (金) 09:39:08 JST


    茂木さん、おはようございます

        ま〜ちゃんです

    それでは、へたくそな関数 ですが、送らせて頂きます、
私は他の言語が長かったので、あるプログラムをPHPに、移行するのに、
出来るだけそのまま動作するように作成しました。応用次第で結構使えます
こういうMLに出すのは、恥ずかしいですが・・・以下です。・・・・長くてスンマセ
ン(^_^;
++++++++++++++++以下コード+++++++++++++++++++++++++
<?php
 define('CHAR_SET', 'SJIS');

$file_name="htmSamp.htm";//テストファイルです

 $file = fopen($file_name, "rb") or die("OPENエラー $file_name");
 // データをまとめて取得する
 $string = fread($file, filesize($file_name));
 fclose($file);  // ファイルを閉じる


 if (mb_InStri($string,"<table"))
 {//table がある
  //トップレベルのテーブルを切り出す
  $buff = mb_striSplitWord($string, "</table>");

  $sbuf = mb_striSplitWordR($buff, "<table");

  $buff= "<table".$buff."</table>" ;//最初のテーブル

    echo $buff."\r\n";//ちょっと拝見

  if (mb_InStri($string,"<a "))
  {
  //TD ここは mb_ereg_??? の方がいいかも

   while(mb_InStri($buff,"</a>"))
   {
    $item = mb_striSplitWord($buff, "</a>");
    $sbuf = mb_striSplitWord($item, "<a ");
    $sbuf = mb_striSplitWord($item, ">");

       echo $item."  \r\n";//この$item は配列に格納した方がいいかも!!

    $url = $sbuf;//この$url も配列に格納した方がいいかも!!
    $sbuf = mb_striSplitWord($url, "href=");

    if (strLeft($url, 1)=="\"")
    {//左に " がある
     $sbuf = mb_striSplitWord($url, "\"");
    }
    if (strRight($url, 1)=="\"")
    {//右に " がある
     $url = mb_striSplitWord($url, "\"");
       echo $url."<br>\r\n";
    }
   }
  }
  //echo $item."<br>\r\n";//ちょっと拝見
 }else
 {
  echo "テーブルなし";
 }


//--------------------ここから関数です------------------

function mb_InStr($str1, $str2){
//この関数は、str1にstr2の文字列が最初に現れた
//(マルチバイトの)文字位置を返します。
// また、見つからないときは、0 を返します

 $i = mb_strpos($str1, $str2, 0, CHAR_SET);

 if ($i==FALSE)
 {
  settype($i, "string");
  if (mb_strlen($i, CHAR_SET) == 0){
   $i=0;
  }else{
   $i=1;
  }
 }else{
  $i++;
 }

 return $i;
}
//------------------------------------------------------

function mb_InStri($str1, $str2){
//この関数は、str1にstr2の文字列が最初に現れた
//(マルチバイトの)文字位置を(大文字、小文字を区別せず)返します。
// また、見つからないときは、0 を返します

 $i = mb_strpos(mb_strtolower($str1, CHAR_SET), mb_strtolower($str2,
CHAR_SET), 0, CHAR_SET);

 if ($i==FALSE)
 {
  settype($i, "string");
  if (mb_strlen($i, CHAR_SET) == 0){
   $i=0;
  }else{
   $i=1;
  }
 }else{
  $i++;
 }

 return $i;
}
//------------------------------------------------------

function mb_InStriR($str1, $str2){
//この関数は、str1にstr2の文字列が最後に現れた
//(マルチバイトの)先頭からの文字位置を(大文字、小文字を区別せず)返します。
// また、見つからないときは、0 を返します

 $i = mb_strrpos(mb_strtolower($str1, CHAR_SET), mb_strtolower($str2,
CHAR_SET), CHAR_SET);

 if ($i==FALSE)
 {
  settype($i, "string");
  if (mb_strlen($i, CHAR_SET) == 0){
   $i=0;
  }else{
   $i=1;
  }
 }else{
  $i++;
 }

 return $i;
}
//------------------------------------------------------

function mb_striSplitWord( &$in_s, $c_and )
{
    $i = 0;
    $out_s = "";

 $i = mb_InStri($in_s, $c_and);

 if ($i > 0)
 {
  $out_s = strLeft($in_s, $i - 1);
  $in_s = mb_substr($in_s, mb_strlen($out_s, CHAR_SET) + mb_strlen($c_and,
CHAR_SET) , mb_strlen($in_s, CHAR_SET) - mb_strlen($out_s, CHAR_SET) - 1,
CHAR_SET);
 }else
 {
  $out_s = $in_s;
  $in_s = "";
 }

  return $out_s;
}
//------------------------------------------------------

function mb_striSplitWordR( &$in_s, $c_and )
{
    $i = 0;
    $out_s = "";

 $i = mb_InStriR($in_s, $c_and);

 if ($i > 0)
 {
  $out_s = strLeft($in_s, $i - 1);
  $in_s = mb_substr($in_s, mb_strlen($out_s, CHAR_SET) + mb_strlen($c_and,
CHAR_SET) , mb_strlen($in_s, CHAR_SET) - mb_strlen($out_s, CHAR_SET) - 1,
CHAR_SET);
 }else
 {
  $out_s = $in_s;
  $in_s = "";
 }

  return $out_s;
}
//------------------------------------------------------

function strLeft($str, $n)
{//変な関数・・・・笑わないで
 $stri = mb_substr($str, 0, $n, CHAR_SET);
 return $stri;
}
//------------------------------------------------------

function strRight($str, $n)
{//これも、笑わないで
 $x = mb_strlen($str, CHAR_SET);

 if ($n > $x)
 {
  $n = $x;
 }
 $stri = mb_substr($str, $x-$n , $n, CHAR_SET);

 return $stri;
}
//------------------------------------------------------
?>
++++++++++++++++以上コード+++++++++++++++++++++++++
こんな変な関数がほかにもいっぱいあります・・・・


> 茂木 様 wrote.
> ま〜ちゃんさん、初めまして。
>
> In the message [PHP-users 21194] Re: ネストされたタグを正規表現で抽出する
場
>                <001f01c41d4e$09a9e400$0500a8c0 @ seji>
> "=?iso-2022-jp?B?GyRCJF4hPCRBJGMkcxsoQg==?=" <ma-chan @ fudou.ne.jp> wrote:
>
>
> >     スタックオーバーフローでエラーが出ているようです
> >     php-4.3.4の Linux 版 とWindows 版 でやってみましたが、少しだけ限界が
違う
> > ようですが・・・
>
> やっぱり、正規表現の実行に限界があるのでしょうか〓〓〓。
>
> >       いっそのこと正規表を使わないで、文字列分割でやってはダメですか?
> >     よろしければ、へたくそな、関数ありますけど・・・
>
> はい、正規表現が無理であればsplitしていくしかないかな
> とも考えておりました。ご参考にさせていただけますでしょうか?
>
> # ただ、今後何かやりたい時にも応用が効きそうという意味で、
> # 正規表現での解決にもこだわってみたいです〓〓〓。
>
> --
> ---------------------------------
>  茂木克夫
>     mogi-k2 @ msg.biglobe.ne.jp
> ---------------------------------
> _______________________________________________
> PHP-users mailing list  PHP-users @ php.gr.jp
> http://ns1.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://www.php.gr.jp/php/novice.php3



PHP-users メーリングリストの案内