/** * 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")); } */ }