Example #1
0
 /**
  * Tagとして正しければTagインスタンスを作成する
  * @param mixed $var
  * @param string $plain
  * @param string $name
  * @return boolean
  */
 public static final function setof(&$var, $plain, $name = null)
 {
     $plain = Text::str($plain);
     $name = Text::str($name);
     if (empty($name) && preg_match("/<([\\w\\:\\-]+)[\\s][^>]*?>|<([\\w\\:\\-]+)>/is", $plain, $parse)) {
         $name = str_replace(array("\r\n", "\r", "\n"), "", empty($parse[1]) ? $parse[2] : $parse[1]);
     }
     $qname = preg_quote($name);
     if (!preg_match("/<(" . $qname . ")([\\s][^>]*?)>|<(" . $qname . ")>/is", $plain, $parse, PREG_OFFSET_CAPTURE)) {
         return false;
     }
     $var = new self();
     $var->pos = $parse[0][1];
     $balance = 0;
     $params = '';
     if (substr($parse[0][0], -2) == '/>') {
         $var->name = $parse[1][0];
         $var->plain = $parse[0][0];
         $params = $parse[2][0];
     } else {
         if (preg_match_all("/<[\\/]{0,1}" . $qname . "[\\s][^>]*[^\\/]>|<[\\/]{0,1}" . $qname . "[\\s]*>/is", $plain, $list, PREG_OFFSET_CAPTURE, $var->pos)) {
             foreach ($list[0] as $arg) {
                 if (($balance += $arg[0][1] == '/' ? -1 : 1) <= 0 && preg_match("/^(<(" . $qname . ")([\\s]*[^>]*)>)(.*)(<\\/\\2[\\s]*>)\$/is", substr($plain, $var->pos, $arg[1] + strlen($arg[0]) - $var->pos), $match)) {
                     $var->plain = $match[0];
                     $var->name = $match[2];
                     $var->value = empty($match[4]) ? null : $match[4];
                     $params = $match[3];
                     break;
                 }
             }
         }
     }
     if (!isset($var->plain)) {
         $var->name = $parse[1][0];
         $var->plain = $parse[0][0];
         $params = $parse[2][0];
     }
     if (!empty($params)) {
         if (preg_match_all("/[\\s]+([\\w\\-\\:]+)[\\s]*=[\\s]*([\"\\'])([^\\2]*?)\\2/ms", $params, $param)) {
             foreach ($param[0] as $id => $value) {
                 $var->param($param[1][$id], $param[3][$id]);
                 $params = str_replace($value, "", $params);
             }
         }
         if (preg_match_all("/([\\w\\-]+)/", $params, $attr)) {
             foreach ($attr[1] as $value) {
                 $var->attr($value);
             }
         }
     }
     return true;
     /***
     			$src = 'AAA<hoge aaa="123" BbB="456" selected><EE>ee</EE></hoge>ZZZZ';
     			if(eq(true,Tag::setof($tag,$src))){
     				eq('<EE>ee</EE>',$tag->value());
     				eq(array("aaa"=>array("aaa","123"),"bbb"=>array("BbB","456")),$tag->ar_param());
     			}
     			eq(false,Tag::setof($src,"abc"));
     		*/
     /***
     			# no_end
     			$src = '<ae>';
     			if(eq(true,Tag::setof($tag,$src,"ae"))){
     				eq("<ae>",$tag->plain());
     			}
     			$src = '<aa><bb><ae abc="123"></bb></aa><ae>456</qe>';
     			if(eq(true,Tag::setof($tag,$src,"ae"))){
     				eq('<ae abc="123">',$tag->plain());
     				eq("123",$tag->in_param("abc"));
     			}
     		 */
 }