svnno****@sourc*****
svnno****@sourc*****
2009年 3月 26日 (木) 21:09:16 JST
Revision: 11 http://svn.sourceforge.jp/view?root=frameworkspider&view=rev&rev=11 Author: m_nakashima Date: 2009-03-26 21:09:16 +0900 (Thu, 26 Mar 2009) Log Message: ----------- Modified Paths: -------------- current/DATA/lib/spider/tags/If.class.php current/DATA/lib/spider/tags/TagBase.class.php -------------- next part -------------- Modified: current/DATA/lib/spider/tags/If.class.php =================================================================== --- current/DATA/lib/spider/tags/If.class.php 2009-03-26 12:01:45 UTC (rev 10) +++ current/DATA/lib/spider/tags/If.class.php 2009-03-26 12:09:16 UTC (rev 11) @@ -92,97 +92,10 @@ * ifタグ内の条件式を解析します。 */ function condition2code( $strings ) { - // 演算時の正規表現 - $signiture_regx = '\\+\\-\\/\\*\\%\\=\\<\\>\\&\\|\\(\\)\\!\\,\\[\\]'; - - // 2文字以上連続のスペースは1文字に統一 - while( preg_match('/\\s\\s/',$strings) > 0 ) { - $strings = str_replace( ' ',' ', $strings ); - } - - // 下位互換の為、and/orは演算子に置換する - $strings = str_replace(' and ', ' && ', $strings ); - $strings = str_replace(' or ', ' || ', $strings ); - // 下位互換の為、is null / is not nullを置換する - $strings = preg_replace('/(|\\s)([^\\s'.$signiture_regx.']*)\\sis\\snull/','$1is_null( $2 )',$strings); - $strings = preg_replace('/(|\\s)([^\\s'.$signiture_regx.']*)\\sis\\snot\\snull/','$1!is_null( $2 )',$strings); - // 下位互換の為inも置換する - $strings = preg_replace('/(|\\s)([^\\s]*)\\sin\\s([^\\s\\}'.$signiture_regx.']*)/','$1in_array( $2 )',$strings); - // 下位互換の為連続していない=は連続=に変換しておく(if文中で代入が利用できなくなる為要検討) - $strings = preg_replace('/([^\\+\\-\\/\\*\\%\\=\\<\\>])\\=([^\\=])/','$1==$2',$strings); - - $converted_strings = ''; - $element_array = preg_split('/([\\s'.$signiture_regx.'])/', $strings, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE ); - $element_data = ''; - $prev_data = ''; - foreach( $element_array as $key => $element ) { - $element_data .= $element; - if( preg_match('/^\\\'/',$element_data) > 0 && substr_count( $element_data, "'" ) % 2 == 1 ) { - // 'から始まって'の数が偶数個なら次のカラムとつなげる - continue; - } else if( preg_match('/^\\\'/',$element_data) > 0 && substr_count( $element_data, "'" ) % 2 == 1 ) { - // 'から始まって'の数が偶数個なら次のカラムとつなげる - continue; - } else { - if( preg_match('/([\\s'.$signiture_regx.'])/',$element_data) == 0 ) { - // 演算子でない場合のみ処理 - if( preg_match('/^\\$/',$element_data ) > 0 ) { - // $から始まるなら変換しないでそのまま追加 - $converted_strings .= $element_data; - } else if( preg_match('/^\\\'/',$element_data ) > 0 && preg_match('/\\\'$/',$element_data ) > 0 ) { - // クォートされているなら文字列 - if( $key > 2 && $element_array[$key-1] == '>' && $element_array[$key-2] == '-'){ - // 前の要素が->オブジェクトメンバ指定子の場合クォートを除去して追加 - $converted_strings .= preg_replace('/(^\'|\'$)/','',$element_data); - } else { - // ただの文字列の場合はそのまま追加 - $converted_strings .= $element_data; - } - } else if( preg_match('/^\\\"/',$element_data ) > 0 && preg_match('/\\\"$/',$element_data ) > 0 ) { - // クォートされているなら文字列 - if( $key > 2 && $element_array[$key-1] == '>' && $element_array[$key-2] == '-'){ - // 前の要素が->オブジェクトメンバ指定子の場合 - $converted_strings .= preg_replace('/(^\\"|\\"$)/','',$element_data); - } else { - // ただの文字列の場合はそのまま追加 - $converted_strings .= $element_data; - } - } else if( preg_match('/^[0-9]+$/',$element_data ) > 0 ) { - // 数字だけならそのまま追加 - $converted_strings .= $element_data; - } else { - // 次の演算子以外の要素が(なら関数なので次の空でない要素をチェック - $is_method = false; - for( $i=$key+1;$i<count($element_array);$i++){ - $val = trim($element_array[$i]); - if( strlen($val) > 0 ) { - if( $val == '(' ) { - $is_method = true; - } - break; - } - } - if( $is_method ) { - // 関数名・メソッド名の場合はそのまま追加 - $converted_strings .= $element_data; - } else if( $key > 2 && $element_array[$key-1] == '>' && $element_array[$key-2] == '-'){ - // メソッドでなくて前の要素が->の場合オブジェクトメンバも変換(要検討...) - $converted_strings .= '$GLOBALS[\''.$element_data.'\']'; - } else { - // それ以外は$GLOBALSへ変換 - $converted_strings .= '$GLOBALS[\''.$element_data.'\']'; - } - } - } else { - // 演算子はそのまま追加 - $converted_strings .= $element_data; - } - $prev_data = $element_data; - $element_data = ''; - } - } - - return $converted_strings; + // 下位互換の文字列変更 + $strings = $this->oldCondition2NewCondition( $strings ); + // ネイティブコードに変換 + return $this->tagCode2NativeCode( $strings ); } /** * if条件文の式を解析する @@ -383,5 +296,27 @@ return $strings; } + /** + * 記述の下位互換の為、条件式文字列を変換するメソッド + */ + function oldCondition2NewCondition( $strings ) { + // 演算時の正規表現 + $signiture_regx = '\\+\\-\\/\\*\\%\\=\\<\\>\\&\\|\\(\\)\\!\\,\\[\\]'; + // 2文字以上連続のスペースは1文字に統一 + while( preg_match('/\\s\\s/',$strings) > 0 ) { + $strings = str_replace( ' ',' ', $strings ); + } + // 下位互換の為、and/orは演算子に置換する + $strings = str_replace(' and ', ' && ', $strings ); + $strings = str_replace(' or ', ' || ', $strings ); + // 下位互換の為、is null / is not nullを置換する + $strings = preg_replace('/(|\\s)([^\\s'.$signiture_regx.']*)\\sis\\snull/','$1is_null( $2 )',$strings); + $strings = preg_replace('/(|\\s)([^\\s'.$signiture_regx.']*)\\sis\\snot\\snull/','$1!is_null( $2 )',$strings); + // 下位互換の為inも置換する + $strings = preg_replace('/(|\\s)([^\\s]*)\\sin\\s([^\\s\\}'.$signiture_regx.']*)/','$1in_array( $2 )',$strings); + // 下位互換の為連続していない=は連続=に変換しておく(if文中で代入が利用できなくなる為要検討) + $strings = preg_replace('/([^\\+\\-\\/\\*\\%\\=\\<\\>])\\=([^\\=])/','$1==$2',$strings); + return $strings; + } } ?> \ No newline at end of file Modified: current/DATA/lib/spider/tags/TagBase.class.php =================================================================== --- current/DATA/lib/spider/tags/TagBase.class.php 2009-03-26 12:01:45 UTC (rev 10) +++ current/DATA/lib/spider/tags/TagBase.class.php 2009-03-26 12:09:16 UTC (rev 11) @@ -122,5 +122,85 @@ } return $option_array; } + /** + * タグコードをPHPコードに変換します + */ + function tagCode2NativeCode( $strings ) { + // 演算時の正規表現 + $signiture_regx = '\\+\\-\\/\\*\\%\\=\\<\\>\\&\\|\\(\\)\\!\\,\\[\\]'; + // 変換後文字列 + $converted_strings = ''; + $element_array = preg_split('/([\\s'.$signiture_regx.'])/', $strings, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE ); + $element_data = ''; + $prev_data = ''; + foreach( $element_array as $key => $element ) { + $element_data .= $element; + if( preg_match('/^\\\'/',$element_data) > 0 && substr_count( $element_data, "'" ) % 2 == 1 ) { + // 'から始まって'の数が偶数個なら次のカラムとつなげる + continue; + } else if( preg_match('/^\\\'/',$element_data) > 0 && substr_count( $element_data, "'" ) % 2 == 1 ) { + // 'から始まって'の数が偶数個なら次のカラムとつなげる + continue; + } else { + if( preg_match('/([\\s'.$signiture_regx.'])/',$element_data) == 0 ) { + // 演算子でない場合のみ処理 + if( preg_match('/^\\$/',$element_data ) > 0 ) { + // $から始まるなら変換しないでそのまま追加 + $converted_strings .= $element_data; + } else if( preg_match('/^\\\'/',$element_data ) > 0 && preg_match('/\\\'$/',$element_data ) > 0 ) { + // クォートされているなら文字列 + if( $key > 2 && $element_array[$key-1] == '>' && $element_array[$key-2] == '-'){ + // 前の要素が->オブジェクトメンバ指定子の場合クォートを除去して追加 + $converted_strings .= preg_replace('/(^\'|\'$)/','',$element_data); + } else { + // ただの文字列の場合はそのまま追加 + $converted_strings .= $element_data; + } + } else if( preg_match('/^\\\"/',$element_data ) > 0 && preg_match('/\\\"$/',$element_data ) > 0 ) { + // クォートされているなら文字列 + if( $key > 2 && $element_array[$key-1] == '>' && $element_array[$key-2] == '-'){ + // 前の要素が->オブジェクトメンバ指定子の場合 + $converted_strings .= preg_replace('/(^\\"|\\"$)/','',$element_data); + } else { + // ただの文字列の場合はそのまま追加 + $converted_strings .= $element_data; + } + } else if( preg_match('/^[0-9]+$/',$element_data ) > 0 ) { + // 数字だけならそのまま追加 + $converted_strings .= $element_data; + } else { + // 次の演算子以外の要素が(なら関数なので次の空でない要素をチェック + $is_method = false; + for( $i=$key+1;$i<count($element_array);$i++){ + $val = trim($element_array[$i]); + if( strlen($val) > 0 ) { + if( $val == '(' ) { + $is_method = true; + } + break; + } + } + if( $is_method ) { + // 関数名・メソッド名の場合はそのまま追加 + $converted_strings .= $element_data; + } else if( $key > 2 && $element_array[$key-1] == '>' && $element_array[$key-2] == '-'){ + // メソッドでなくて前の要素が->の場合オブジェクトメンバも変換(要検討...) + $converted_strings .= '$GLOBALS[\''.$element_data.'\']'; + } else { + // それ以外は$GLOBALSへ変換 + $converted_strings .= '$GLOBALS[\''.$element_data.'\']'; + } + } + } else { + // 演算子はそのまま追加 + $converted_strings .= $element_data; + } + $prev_data = $element_data; + $element_data = ''; + } + } + + return $converted_strings; + } } ?> \ No newline at end of file