[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 メーリングリストの案内