다중 업로드

WEB/ASP.NET 2008. 5. 28. 16:43
티스토리식 다중업로드를 찾다가 알게된녀석
그나마 코드 프로젝트중 제일나은듯
http://www.codeproject.com/KB/aspnet/FlashUpload.aspx

플래시를 이용한 업로드이고 화면도 깔끔에 플래시 소스도 공개..
좋아 >_<

사용자 삽입 이미지
사용자 삽입 이미지

음냐냐 그나저나 적용 가능하려나..
플래시에서 데이터 받아오기 지롤인데 ㅠ_ㅠ

*추가
라고 적고보니 이넘은 플렉스 버전이다 =.=
Flex2.0SDK받아서 수작업으로 고쳐서 사용중...
* 요건 상용
http://ajaxuploader.com/
사용자 삽입 이미지

AND

하나의 모달팝업에 여러개의 취소버튼 넣기..
자바스크립트를 이용한 고스트스텝(?) ㅋㅋ
http://mattberseth.com/blog/2007/10/modalpopup_with_multiple_cance.html
AND

보통 인라인 뷰에서 정렬을 시도하면 다음과 같은 에러가 난다.

The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.

이럴때 인라인 뷰에서 정렬을 사용하기 위해서는 셀렉트에 TOP 100 PERCENT 를 써주면 된다.
SELECT * FROM
(
   SELECT TOP 100 PERCENT
          TEST1
        , SUM(TEST2) SUM_TEST2
     FROM #TEMP
  GROUP BY TEST1
  ORDER BY SUM(TEST2) DESC
) V


출처 : http://www.lemonee.com/tt/trackback/44
AND

System.Web.HttpResponse objResponse = System.Web.HttpContext.Current.Response;

   objResponse.ClearContent();
   objResponse.ClearHeaders();
   objResponse.ContentType = "application/vnd.msexcel";
   objResponse.AddHeader("content-disposition", "attachment; filename=SearchResults.xls");
   objResponse.AppendHeader("Content-Length", result.Length.ToString());
   objResponse.Charset = "euc-kr";
   objResponse.ContentEncoding = Encoding.GetEncoding(949);
   objResponse.Write(result);
   objResponse.Flush();
   objResponse.Close();
   objResponse.End();

예제는 엑셀 데이터를 다운로드 하는 경우이다. result string 에는 탭으로 분리된 텍스트를 넣어주면 xls파일로 다운로드 된다. 정식 엑셀 파일은 아니고 csv를 xls 확장자로 다운로드 하면 나머지는 엑셀이 알아서 한다. 푸른색으로 된 부분은 한글 코드 문제로 넣어 준것이다. 그냥 Unicode로 보내면 엑셀이 제대로 처리하지 못한다. 이유는 모르겠다.

출처 : http://www.code99.net/Default.aspx?tabid=794&EntryID=186

Exporting DataGrid to Excel

Exporting DataGrid to Excel might sound complex but it's pretty simple. Let's see how this can be done.

Response.Clear();
Response.AddHeader("content-disposition", "attachment;filename=FileName.xls");
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.ContentType = "application/vnd.xls";

System.IO.StringWriter stringWrite = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);

myDataGrid.RenderControl(htmlWrite);
Response.Write(stringWrite.ToString());
Response.End();

The code given above is the complete code to export a DataGrid to an Excel file:

  • Response.AddHeader is letting ASP.NET know that we are exporting to a file which is named FileName.xls.
  • Response.ContentType denotes the type of the file being exported.
  • myDataGrid.RenderControl(htmlWrite) writes the data to the HtmlTextWriter.
  • Response.Write(stringWrite.ToString()); sends the request to the response stream.

As you can see, exporting a DataGrid to an Excel file is pretty simple.

Exporting the DataGrid to a Word file

You can also export a DataGrid to a Word file. You might ask a question that why would anyone like to do that. If you have a Word document which needs a table, then you can simply export the table from the DataGrid to the Word document. The code is similar to the above with minor changes.

Response.Clear();
Response.AddHeader("content-disposition", "attachment;filename=FileName.doc");
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.ContentType = "application/vnd.word";

System.IO.StringWriter stringWrite = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);

myDataGrid.RenderControl(htmlWrite);
Response.Write(stringWrite.ToString());
Response.End();

Exporting a DataGrid to a Text File

Sometimes you need to export a DataGrid to a Text file. In this case you need to iterate through the DataSet and concatenate the text to a string or more precisely a StringBuilder object. Let's see how this can be done:

Collapse
Database db = DatabaseFactory.CreateDatabase();
DBCommandWrapper selectCommandWrapper = 
   db.GetStoredProcCommandWrapper("sp_GetLatestArticles");
DataSet ds = db.ExecuteDataSet(selectCommandWrapper);
StringBuilder str = new StringBuilder();

for(int i=0;i<=ds.Tables[0].Rows.Count - 1; i++)
{
  for(int j=0;j<=ds.Tables[0].Columns.Count - 1; j++)
  {
      str.Append(ds.Tables[0].Rows[i][j].ToString());
  }

  str.Append("<BR>");
}

Response.Clear();
Response.AddHeader("content-disposition", 
         "attachment;filename=FileName.txt");
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.ContentType = "application/vnd.text";

System.IO.StringWriter stringWrite = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter htmlWrite = 
              new HtmlTextWriter(stringWrite);

Response.Write(str.ToString());
Response.End();

The important thing to note is the two for loops that iterate through the DataSet and append the rows into the StringBuilder object.

Format Issue when Exporting DataGrid to Excel

I would like to thank Sonu Kapoor for helping me with the Format issue in exporting a DataGrid to Excel and Juss for providing the code.

When you export a DataGrid to Excel it loses its format. This means that maybe your DataGrid has a string field which consisted of numbers, say '002345'. But when you export the grid and see it in an Excel file you will find that the number changed to '2345'.

You can solve this problem using Cascading Style Sheets.

Code provided by Juss:

Dim strFileName, strFilePath AsString
Dim oStringWriter AsNew System.IO.StringWriter
Dim oHtmlTextWriter AsNew System.Web.UI.HtmlTextWriter(oStringWriter)
Dim objStreamWriter As StreamWriter
Dim strStyle AsString = "<style>.text { mso-number-format:\@; } </style>"
objStreamWriter = File.AppendText(strFilePath)
DataGrid1.RenderControl(oHtmlTextWriter)
objStreamWriter.WriteLine(strStyle)
objStreamWriter.WriteLine(oStringWriter.ToString())
objStreamWriter.Close()

Most of you might be thinking about that "mso-number-format" stuff in between the code. This is the style in which the column will be exported. For this reason, you need to inject the attribute into the DataGrid column for which you want to change the display format.

DataGrid1.DataBind()
Dim strStyle AsString = "<style>.text { mso-number-format:\@; } </style>"
For intTemp AsInteger = 1 To ds.Tables(0).Rows.Count - 1
   DataGrid1.Items(intTemp).Cells(0).Attributes.Add("class", "text")
Next

You can export in many formats. All you need to know is the mso-number-format:\@;. You can easily find the format by opening an Excel file and typing a number in one of the cells. Now if you want to save this number as a Social Security Pattern (xxx-xx-xxxx), right click on the cell and select a pattern that saves it as a Social Security Number. Next save the Excel file to XML format. Open the XML file in Notepad and see what style the column SSN uses. The SSN style is something like this: mso-number-format:000\-00\-0000.

Simply substitute the new style in the strStyle variable and that's it.

For a complete discussion on this issue, please visit this link.

I hope you liked the article, happy coding!

출처 : http://blog.naver.com/jjigye/30012879332

AND

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>

<BODY>
<script LANGUAGE="JavaScript">
<!--
// ------------------------- 드림위버에 기본적으로 들어간 JS -------------------------
function MM_preloadImages() { //v3.0
var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_swapImgRestore() { //v3.0
var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.01
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

function MM_openBrWindow(theURL,winName,features) { //v2.0
window.open(theURL,winName,features);
}
//-------------------------------------------------------------------------------------

// ---------------- 팝업창 시에 사용할 함수 -------------------------------
function getCOOKIE(name){
var nameOfCOOKIE = name + "=";
var x = 0;
while ( x <= document.COOKIE.length ){
var y = (x+nameOfCOOKIE.length);
if ( document.COOKIE.substring( x, y ) == nameOfCOOKIE ){
if ( (endOfCOOKIE=document.COOKIE.indexOf( ";", y )) == -1 )
endOfCOOKIE = document.COOKIE.length;
return UNESCAPE( document.COOKIE.substring( y, endOfCOOKIE ) );
}
x = document.COOKIE.indexOf( " ", x ) + 1;
if ( x == 0 )
break;
}
return "";
}

function setCOOKIE( name, value, expiredays ){
var todayDate = new Date();
todayDate.setDate( todayDate.getDate() + expiredays );
document.COOKIE = name + "=" + escape( value ) + "; path=/; expires=" + todayDate.toGMTString() + ";"
}


// ------------------------------------- 기타 함수들 ----------------------------------------

// 메일패턴 체크
function fnc_EmailChk(str_regexp){
var check_string = true;
var check_data = new RegExp('[a-zA-Z0-9@._]');

for(i = 0; i < str_regexp.length ; i++){
check_string = check_data.test(str_regexp.substr(i,1));
if(!check_string){
break;
}
}
return check_string;
}

// ' 와 " 의 입력을 막음
function fnc_NoneWrite(e){
var keyValue = event.keyCode
if((keyValue == 34)||(keyValue == 39)) return false;
}

// 공백제거 함수
function fnc_trim(str){
return str.replace(/(^\s*)|(\s*$)/g, "");
}

// 숫자만입력 ( onKeypress='return keyCheck(event)' )
function keyCheck(e) {
var keyValue = event.keyCode
if (((keyValue >= 48) && (keyValue <= 57)) || keyValue==13 ) return true;
else return false
}

// - 음수입력
function keyCheck_minus(e) {
var keyValue = event.keyCode
if (((keyValue >= 48) && (keyValue <= 57)) || keyValue==13 || keyValue==45) return true;
else return false
}

// 콤마 넣기(정수만 해당)
function comma(val) {
val = get_number(val);
if(val.length <= 3) return val;

var loop = Math.ceil(val.length / 3);
var offset = val.length % 3;

if(offset==0) offset = 3;
var ret = val.substring(0, offset);

for(i=1;i<loop;i++) {
ret += "," + val.substring(offset, offset+3);
offset += 3;
}
return ret;
}

// 콤마 넣은 값을 특정폼의 필드에 리턴해줄때 사용
function fnc_currency(Form_name, Field_name){
form = document.forms[Form_name];
tmp_value = form.elements[Field_name].value;
form.elements[Field_name].value = comma(tmp_value);
}

// 영문대소문자, 숫자, 언더바, . 을 포함하여 입력 받음, 한글도 입력 받음
function fnc_Write_dot(e){
var keyValue = event.keyCode
if(!(((keyValue >= 48)&&(keyValue <= 57))||((keyValue >= 65)&&(keyValue <= 90))||((keyValue >= 97)&&(keyValue <= 122))||(keyValue == 46)||(keyValue == 45)||(keyValue == 95))){
return false;
}
}

// 영문대소문자, 숫자, 언더바만 입력받음, 한글도 입력 받음
function fnc_Write_string(e){
var keyValue = event.keyCode
if(!(((keyValue >= 48)&&(keyValue <= 57))||((keyValue >= 65)&&(keyValue <= 90))||((keyValue >= 97)&&(keyValue <= 122))||(keyValue == 45)||(keyValue == 95))){
return false;
}
}

function fnc_ImgExt(ImgFile){
ImgFile = ImgFile.toLowerCase();
if((ImgFile.indexOf(".gif") == -1)&&(ImgFile.indexOf(".jpg") == -1)&&(ImgFile.indexOf(".jpeg") == -1)){
return false;
}else{
return true;
}
}

// 라디오 버튼 체크
function fnc_OptChk(obj){
Optchk = false;
for(i = 0; i < obj.length; i++){
if(obj[i].checked == true){
Optchk = true; break;
}
}
return Optchk
}

function fnc_OptChk_idx(obj){
OptIdx = "";
for(i = 0; i < obj.length; i++){
if(obj[i].checked == true){
OptIdx = i; break;
}
}
return OptIdx
}

function fnc_download(file_origin, file, path, service, div, numseq){
Location.href='/common/download.php?file_origin=' + file_origin + '&file=' + file + '&path=' + path + '&service=' + service + '&div=' + div + '&numseq=' + numseq;
}


function fnc_StrChk(vString, vlength){
var chkBln = true;
if(vString.length >= vlength){
var chkStr = new RegExp('[^a-zA-Z0-9_]');
for(i = 0; i < vString.length; i++){
chkBln = !(chkStr.test(vString.substr(i,1)));
if(chkBln == false){ break; }
}
}else{
chkBln = false;
}
return chkBln;
}

function fnc_HStrChk(vString, vlength){
var chkBln = true;
if(vString.length < vlength){
chkBln = false;
}
return chkBln;
}

function fnc_EmailChk(vString, vlength){
var chkBln = true;
if((vString.length >= vlength) && (vString.indexOf("@") != -1) && (vString.indexOf(".") != -1)){
var chkStr = new RegExp('[^a-zA-Z0-9@._]');
for(i = 0; i < vString.length; i++){
chkBln = !(chkStr.test(vString.substr(i,1)));
if(chkBln == false){ break; }
}
}else{
chkBln = false;
}
return chkBln;
}

function fnc_NumChk(vString, vlength){
var chkBln = true;
if(vString.length >= vlength){
var chkStr = new RegExp('[^0-9]');
for(i = 0; i < vString.length; i++){
chkBln = !(chkStr.test(vString.substr(i,1)));
if(chkBln == false){ break; }
}
}else{
chkBln = false;
}
return chkBln;
}

function fnc_JuminNumChk(vString) {
var chkBln = true;
if(vString.length != 13){
chkBln = false;
}else{
var a= vString.substring(0, 1);
var b= vString.substring(1, 2);
var c= vString.substring(2, 3);
var d= vString.substring(3, 4);
var e= vString.substring(4, 5);
var f= vString.substring(5, 6);
var g= vString.substring(6, 7);
var h= vString.substring(7, 8);
var i= vString.substring(8, 9);
var j= vString.substring(9, 10);
var k= vString.substring(10, 11);
var l= vString.substring(11, 12);
var m= vString.substring(12, 13);

var sum = 2*a + 3*b + 4*c + 5*d + 6*e + 7*f + 8*g + 9*h + 2*i + 3*j + 4*k + 5*l;
var r1 = sum % 11;
var temp = 11*((sum-r1)/11)+11-sum;
var r2 = temp % 10;
var temp1 = temp-10*((temp-r2)/10);

if(m != temp1){
chkBln = false;
}else{
chkBln = true;
}
}
return chkBln;
}

function fnc_ComNoChk(comno) {
var chkBln = true;
if(comno.length != 10){
chkBln = false;
}
sumMod = 0;
sumMod += parseInt(comno.substring(0,1));
sumMod += parseInt(comno.substring(1,2)) * 3 % 10;
sumMod += parseInt(comno.substring(2,3)) * 7 % 10;
sumMod += parseInt(comno.substring(3,4)) * 1 % 10;
sumMod += parseInt(comno.substring(4,5)) * 3 % 10;
sumMod += parseInt(comno.substring(5,6)) * 7 % 10;
sumMod += parseInt(comno.substring(6,7)) * 1 % 10;
sumMod += parseInt(comno.substring(7,8)) * 3 % 10;
sumMod += Math.floor(parseInt(comno.substring(8,9)) * 5 / 10);
sumMod += parseInt(comno.substring(8,9)) * 5 % 10;
sumMod += parseInt(comno.substring(9,10));

if (sumMod % 10 != 0) {
chkBln = false;
}
return chkBln;
}


// ------ 특수문자 예외처리 -----------
function fnc_NotKeywordChk(vString){
blnChk = false;
if(vString.indexOf("~") != -1 || vString.indexOf("`") != -1 || vString.indexOf("!") != -1 ||
vString.indexOf("@") != -1 || vString.indexOf("#") != -1 || vString.indexOf("$") != -1 ||
vString.indexOf("%") != -1 || vString.indexOf("^") != -1 || vString.indexOf("&") != -1 ||
vString.indexOf("*") != -1 || vString.indexOf("(") != -1 || vString.indexOf(")") != -1 ||
vString.indexOf("-") != -1 || vString.indexOf("_") != -1 || vString.indexOf("=") != -1 ||
vString.indexOf("+") != -1 || vString.indexOf("[") != -1 || vString.indexOf("{") != -1 ||
vString.indexOf("]") != -1 || vString.indexOf("}") != -1 || vString.indexOf("\\") != -1 ||
vString.indexOf("|") != -1 || vString.indexOf(";") != -1 || vString.indexOf(":") != -1 ||
vString.indexOf("'") != -1 || vString.indexOf('"') != -1 || vString.indexOf(",") != -1 ||
vString.indexOf("<") != -1 || vString.indexOf(".") != -1 || vString.indexOf(">") != -1 ||
vString.indexOf("/") != -1 || vString.indexOf("?") != -1 )
{
blnChk = false;
}
else
{
blnChk = true;
}
return blnChk;
}

//---------- 텍스트 바이트 체크 (폼이름, 체크필드명, 체크된바이트 리턴필드명) ---------------- //

function fnc_CheckByte(form,checkField,returnField){
checkCount = 0;
checkText = document.forms[form].elements[checkField].value;
checkTmp = checkText.length;

for(k = 0; k < checkTmp; k++){
checkOne = checkText.charAt(k);
if(escape(checkOne).length > 4){
checkCount += 2;
}else{
// 엔터값이 들어왔을때 값(rn)이 두번실행되는데 첫번째 값(n)이 들어왔을때 tcount를 증가시키지 않는다.
if(escape(checkOne) == '%0A') {
}else{
checkCount++;
}
}
}

document.forms[form].elements[returnField].value = checkCount;
}
//-->
</script>
</BODY>
</HTML>


출처 : 다 되게 되어있다! 용호리눅스

AND

  --- HTMLElement 객체의 프로퍼티 ---

 all              ⓔ     특정한 HTMLElement 객체에 포함된 모든 태그들의 컬렉션
 align           ⓔ    Block 효과를 가지는 태그의 align 속성을 가리키는 객체의 속성
 className         스타일시트의 Selector로 사용하기 위해 태그에 사용된 class 속성의 값
 children      ⓔ   특정한 태그에 1차적으로 포함되어 있는 HTMLElement 객체들의 컬렉션


 clientHeight         객체에 적용된 여백과 테두리, 스크룰바를 제외한 높이
 clientWidth   ⓔ    객체에 적용된 여백과 테두리, 스크룰바를 제외한 너비
 clientLeft     ⓔ    HTMLElement 객체의 기준위치로부터의 왼쪽 간격(테두리선 두께)
 clientTop    ⓔ    HTMLElement 객체의 기준위치로부터의 위쪽 간격(테두리선 두께)
 dir                      글씨가 오른쪽 혹은 왼쪽부터 써지도록 설정 ("ltr" 혹은 "rtl")


 disabled             HTMLElement 객체의 상태를 사용할 수 없도록 할 것인지의 여부설정
 id                       HTMLElement 객체의 스타일을 적용하기 위해 태그에 사용된 ID 속성
 innerHTML          종료태그를 가진 태그의 마크영역에 포함된 태그를 포함한 문자열
 innerText     ⓔ     종료태그를 가진 태그의 마크영역에 포함된 태그를 제외한 문자열
 outerText     ⓔ     해당 요소에 포함된 태그를 제외하는 모든 문자열
 outerHTML   ⓔ     해당 요소의 시작과 끝태그까지를 포함하는 전체 문자열


 style                  태그에 사용된 STYLE 속성으로서 객체로 취급된다.
 tagName            HTMLElement 객체를 만들어낸 태그의 이름(예 H1, input, div 등)
 this                    해당 html 태그에서 자기 자신의 HTMLElement 객체를 참조
 title                    태그의 title 속성으로 마우스포인터가 왔을 때 나타낼 설명 문자열


 sourceIndex    ⓔ   HTMLElement 객체를 document.all[index]로 접근할 때의 index 값
 parentElement ⓔ   HTMLElement 객체를 포함하고 있는 부모객체를 참조한다.
 offsetParent           HTMLElement 객체의 기준 위치를 결정하는 부모 HTMLElement 객체
 offsetHeight           HTMLElement 객체와 그 내용물을 포함하는 전체 높이
 offsetWidth            HTMLElement 객체와 그 내용물을 포함하는 전체 너비
 offsetLeft              HTMLElement 객체의 왼쪽 좌표로서 부모객체에 상대적인 x 축 기준점
 offsetTop             HTMLElement 객체와 위쪽 좌표로서 부모객체에 상대적인 y 축 기준점
 readyState    ⓔ    HTMLElement 객체의 메모리 로딩상태를 표현(uninitialized ~ complete)


 scrollHeight   ⓔ    스크롤되는 HTMLElement 객체의 스크롤된 부문을 포함하는 전체 높이
 scrollWidth    ⓔ    스크롤되는 HTMLElement 객체의 스크롤된 부문을 포함하는 전체 너비
 scrollLeft       ⓔ    스크롤되는 HTMLElement 객체의 왼쪽으로 스크롤된 부문의 픽셀값
 scrollTop      ⓔ    스크롤되는 HTMLElement 객체의 위쪽으로 스크롤된 부문의 픽셀값


           ※  ⓔ 는 Explorer 에서만 지원되는 컬렉션.

사용자 삽입 이미지


        ----  Collection 의 종류------

 

 all            ⓔ     HTML 문서에 포함된 모든 태그를 배열로 접근하는 컬렉션
 applets           <applet> 태그의 HTMLElment 객체 컬렉션
 anchors          <a>  태그에 name 속성이 사용된 Anchor 객체의 컬렉션


 cells        ⓔ     <table> 에 포함된 <td><th> 태그의 HTMLElement 컬렉션
 children    ⓔ     html 문서에서 태그들의 포함관계에서 자식 객체의 컬렉션
 childNodes       DOM 의 특정노드에 포함된 자식 노들의 노드리스트 컬렉션
 elements         <Form>  태그의 내부에 사용되는는 입력양식 객체들의 컬렉션


 embeds           <embed> 태그의 HTMLElement 객체 컬렉션
 images            <img>   태그의 HTMLElement 객체 컬렉션
 filters      ⓔ      특정      태그의 style 속성에 사용한 필터객체의 컬렉션
 
frames             <frame> 혹은 <iframe> 태그로 정의되는 프레임 컬렉션
 links                <a href=""> <area href="">태그로 정의되는 링크 컬렉션


 options          <select> 태그에 포함되는 <option> 태그의 컬렉션
 plugins          <embed>  태그로 만들어지는 멀티미디어 파일의 컬렉션
 scripts            <script> 태그로 만들어지는 스크립터 공간의 컬렉션
 stylesheets      <LINK> <STYLE> 태그로 만들어지는 스타일시트 컬렉션             
            
      ※  ⓔ 는 Explorer 에서만 지원되는 컬렉션.


  all 컬렉션.
    <html>
       <head><title> 제목 </title> </head>
        <body>
            <img src="../aa.gif">
        </body>
     </html>

  document.all[0]= <html>  document.all[1]= <head>
   document.all[2]= <title> document.all[3]= <body>
   document.all[4]= <img>
  
    ID 속성을 사용하면 Document 객체의 all 컬렉션을 이용해서
    특정 HTMLElement 객체을 참조할  수 있다.

    document.all[index]  document.all["name"]
     document.all("name") document.all.name     document.all["ID"]




                    --  Event 의 종류 --

 

  Abort            이미지를 읽어 들이는 일이 도중에 중단될 때 발생하는 이벤트
 BeforeCopy   글씨를 복사하기 위해서 오른쪽 마우스나 CTR+C를 누를 때 발생하는 이벤트
 BeforeCut      글씨를 잘라내기 위해서 오른쪽 마우스나 CTR+x를 누를 때 발생하는 이벤트
 beforePaste   글씨를 붙여넣기 위해서 오른쪽 마우스나 CTR+v를 누를 때 발생하는 이벤트
 
 AfterPrint         브라우저에서 인쇄 버튼을 클릭하면 인쇄영역이 활성화된 후에 발생
 BeforePrint      브라우저에서 인쇄 버튼을 클릭하면 인쇄영역이 활성화되기 전에 발생
 BeforeUnload   문서가 메모리에서 해제될 때  Unload 이벤트보다 일찍 발생하는 이벤트

 
 Blur             특정 객체로부터 포커스가 빠져나갈 때 발생하는 이벤트
 Change       입력양식에서 값이 바뀌게 되는 순간에 발생하는 이벤트
 Click           마우스로 특정 객체를 클릭할 때 발생하는 이벤트
 
 ContextMenu  팝업메뉴를 보기 위해 오른쪽 마우스를 클릭 할때 발생하는 이벤트
 Copy             팝업메뉴의 "복사" 항목을 누르거나 CTR+C를 누를 때 발생하는 이벤트
 Cut                팝업메뉴의 "잘라내기" 항목을 누르거나 CTR+x 를 누를 때 발생하는 이벤트
 DblClick          마우스를 더블클릭했을 때 발생하는 이벤트
 
 Drag            드래그 동안에 드래그를 시작한 객체에서 계속해서 발생하는 이벤트
 DragStart     드래그를 시작한 객체에서 최초에 발생되는 Dragstart 이벤트
 DragEnter    드래그 도중에 만나는 객체의 영역으로 들어가는 순간에 발생하는 이벤트
 DragOver     드래그 도중에 만나는 객체의 영역에서 계속해서  발생하는 이벤트
 DragLeave    드래그 도중에 만나는 객체의 영역에서 벗어나는 순간에 발생하는 이벤트
 DragEnd      드래그가 끝났을때 드래그를 시작한 객체에서 발생하는 Dragend 이벤트
 
 Drop             드래그가 끝났을때 드래그를 끝낸 객체에서 발생하는 Drop 이벤트
 Error             문서나 이미지를 Loading 하다가 에러가 발생할때 의 이벤트
 Focus           특정 객체가 포커스를 얻을 때 발생하는 이벤트

 KeyDown      키보드를 눌러서 글씨가 써지기 전에 최초의 순간에 발생하는 이벤트
 KeyPress      키보드를 눌러서 글씨가 써지기 직전에 발생하는 이벤트(Netscape는 최초)
 KeyUp           키보드를 떼어내는 순간에 발생하는 이벤트


 Load              window에 문서의 내용이 새롭게 Loading 되면 발생하는 이벤트
 Mousedown    문서영역의 특정 객체를 마우스로 누를 때 발생하는 이벤트
 MouseEnter    
특정객체에  마우스가 들어오는 최초의 순간에 발생하는 이벤트

 MouseMove    문서영역의 특정 객체에서 마우스를 움직일 때 발생하는 이벤트
 MouseOut       문서영역의 특정 객체에서 마우스가 벗어날 때 발생하는 이벤트
 MouseOver     문서영역의 특정 객체 위에 마우스가 올려져 있을 때 발생하는 이벤트
 MouseUp        마우스 버튼을 뗐을 때 발생하는 이벤트
 MouseWheel  
문서영역의 특정 객체에서 마우스휠을 움직일 때 발생하는 이벤트


 Move         윈도우, 프레임같은  객체를 움직이기 시작하는 순간에 발생하는 이벤트
 Paste        팝업메뉴의 "붙여넣기" 항목을 누르거나 CTR+x를 누를 때 발생하는 이벤트
 Reset        입력양식의 Reset 버튼을 눌러서 내용이 초기화될 때 발생하는 이벤트
 Resize       윈도우, 프레임 , HTMLElement 객체의 크기가 변경될 때 발생하는 이벤트


 Scroll          문서나 Textarea와 같은 객체에서 내용을 스크롤시킬 때 발생하는 이벤트
 Select         입력양식에 입력된 문자나 Option 객체를 선택했을 때 발생하는 이벤트
 SelectStart   문서 일부를 복사하기 위애 내용을 선택하는 최초의 순간에 발생하는 이벤트
 Submit        입력양식의 Submit 버튼을 눌러서 내용이 전송되기 직전에 발생하는 이벤트
 Unload        문서 정보가 메모리에서 해제되려는 순간에 발생하는 이벤트



---------------------------------------------------------------------

     Text 입력요소에 적용되는 IME-MODE의 속성값


active        IME-MODE를 활성화 시켜서 한글이 입력되도록  한다(한/영 변환키 사용가능).

inactive     IME-MODE를 불활성화 시켜서 영문이 입력되도록 한다(한/영 변환키 사용가능).

disabled    IME-MODE를 사용 할 수 없도록 하영 영문만 입력할 수 있는 상태로 만든다.

                 (한/영 변환키를 사용해도 한글 전환이 되지 않는다).

auto          기본값으로 현재 한/영 키의 상태로 입력되도록 한다.

  

<Explorer 5.5이상 전용>

     <input type="text" style="IME-MODE:active">


출처 : http://blog.naver.com/rakis77/70022030743

AND

개체.getBoundingClientRect()
출력화면에 기준한 좌표체계를 돌려줌 속성으로 x, y가 있음
출력화면 기준으로인해 브라우저 스크롤의 경우 좌표가 꼬임
우회방법: 레이어의 스크롤을 하게되면 브라우저 스크롤의 좌표와는 상관없이 보여지는 개체의 정확한 위치가 잡아짐

개체.offsetLeft , Top..
내장개체에 position을 absolute를 먹이지 않는 이상 상위 개체의 내부여백의 영향으로 좌표에 문제가 생길 수 있음 (ex:body)
고로 부모의 offset을 체크할 필요가 생김

개체.className
개체에 설정된 스타일 클래스의 값을 돌려줌.

개체.getAttribute('속성명')
특정속성값을 가져옴(id 등 을 못 가져올때 사용)
참고로 id는 닷넷, DOM, HTML, JAVASCRIPT에서 약간씩 다른듯함

innerHtml ?
innerText (IE)
innerXml ?
outerHtml (IE)
outerText (IE)
outerXml ?

등이 존재..
자식포함 옵션도 존재
(조사필요)

document.elementFromPoint(x,y)
좌표체계에 기준을한 개체선택방법
아마도 최상위의 개체를 가져다줄듯함..
익스플로러 전용인듯함

document.createElement("태그명")
or document.createElement("<태그 속성=""....></태그>")

속성이 많아서 설정하기 귀찮을땐 후자를 추천

*요넘들과 함께 사용
개체.setAttribute('속성명','값')
개체.appendChild(자식개체)
개체.removeChild(자식개체)

개체.
부모찾기
개체.parentElement (IE)
자식찾기
개체.children (IE) <==덩어리
개체.childNodes <==덩어리
개체.childNodes[1] <==1+1번째자식
개체.firstChild
개체.lastChild

event.srcElement
이벤트를 일으킨 개체(IE)

parseInt(문자)
닷넷의 int.parse("")와 동일

getParentByAttr(개체,'name','value')
재귀적포함관계를 갖는 구조화된 개체의 부모를 찾기위해만듬
용도는 알아서..
        function getParentByAttr(sender, nm, vlu)
        {
            if(sender.parentElement!=null)
            {
                if(sender.parentElement.getAttribute(nm)==vlu)
                {
                    return sender.parentElement;
                }
                else
                {
                    return getParentByAttr(sender.parentElement, nm, vlu);
                }
            }
            else
            {
                return null;
            }
        }

AND

아래 동영상은 마소의 ASP.net 에서 퍼온것입니다.

 

아래글은 Nx 블로그에서 퍼온글 입니다.


FilteredTextBox 컨트롤은 TextBox 컨트롤에 특정 값만 입력할 수 있는 기능을 제공하는 컨트롤입니다. 즉, 어떠한 TextBox 컨트롤에는 숫자만, 다른 TextBox 컨트롤에는 문자만 입력이 가능한 기능을 제공하는 TextBox 컨트롤을 사용할 때 유용합니다. 기존에는 자바스크립트를 사용하여 유효성 검사를 체크하는 함수를 호출하곤 했는데 FilteredTextBox 컨트롤을 사용하면 그러한 불편을 겪지 않아도 됩니다.

먼저, FilteredTextBox 컨트롤이 가지고 있는 속성부터 알아보도록 하겠습니다.

<ajaxToolkit:FilteredTextBoxExtender ID="ftbe" runat="server"
TargetControlID="TextBox3"
FilterType="Custom, Numbers"
ValidChars="+-=/*()." />


이탤릭체의 속성은 옵션으로 사용할 수 있는 속성입니다.

속성에 대한 설명은 다음과 같습니다.

1. TargetControlID : 동작할 TextBox 컨트롤의 ID입니다.

2. FilterType : TextBox 컨트롤에 적용될 필터의 타입입니다. "Numbers", "LowercaseLetters", "UppercaseLetters", "Custom" 중 하나의 값을 지정하면 되며, "Custom" 속성을 지정하면 ValidChars 속성을 사용하여, 입력할 문자를 설정할 수 있습니다. 또한 "Custom"을 지정하면, 다른 "Numbers", "LowercaseLetters", "UppercaseLetters"와 같은 설정값을 동시에 사용할 수 있습니다.

3. ValidChars : TextBox 컨트롤에 입력할 문자를 정의합니다.

그럼, 웹 폼을 하나 생성하고, 다음과 같이 코드를 작성합니다.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="FilteredTextBox.aspx.cs" Inherits="FilteredTextBox" %>


<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

    <title>제목 없음</title>

</head>

<body>

    <form id="form1" runat="server">

        <asp:ScriptManager ID="ScriptManager1" runat="server">

        </asp:ScriptManager>

        <table border="0" cellpadding="0" cellspacing="0" style="background-color:#959695;" width="600px">

            <tr style="height: 30px" valign="middle">

                <td style="width: 100%; font-size: 11pt; color: White;" align="center" colspan="3">

                    FilteredTextBox Controls

                </td>

            </tr>

            <tr style="height: 30px" valign="middle">

                <td style="width: 1%">

                </td>

                <td style="width: 98%; background-color: White; font-size: 9pt;" align="left">

                    &nbsp;&nbsp;숫자만 입력 가능 : <asp:TextBox ID="txtText1" runat="server" Width="300px"></asp:TextBox>

                </td>

                <td style="width: 1%">

                </td>

            </tr>

            <tr style="height: 30px" valign="middle">

                <td style="width: 1%">

                </td>

                <td style="width: 98%; background-color: White; font-size: 9pt;" align="left">

                    &nbsp;&nbsp;소문자만 입력 가능 : <asp:TextBox ID="txtText2" runat="server" Width="300px"></asp:TextBox>

                </td>

                <td style="width: 1%">

                </td>

            </tr>

            <tr style="height: 30px" valign="middle">

                <td style="width: 1%">

                </td>

                <td style="width: 98%; background-color: White; font-size: 9pt;" align="left">

                    &nbsp;&nbsp;숫자 + 정의된 문자(-)만 입력 가능 : <asp:TextBox ID="txtText3" runat="server" Width="300px"></asp:TextBox>

                </td>

                <td style="width: 1%">

                </td>

            </tr>

            <tr style="height: 2px" valign="middle">

                <td style="width: 100%;" align="center" colspan="3">

                </td>

            </tr>


        </table>


        <cc1:FilteredTextBoxExtender

                                    ID="FilteredTextBoxExtender1"

                                    runat="server"

                                    TargetControlID="txtText1"

                                    FilterType="numbers">

        </cc1:FilteredTextBoxExtender>

        <cc1:FilteredTextBoxExtender

                                    ID="FilteredTextBoxExtender2"

                                    runat="server"

                                    TargetControlID="txtText2"

                                    FilterType="LowercaseLetters">

        </cc1:FilteredTextBoxExtender>

        <cc1:FilteredTextBoxExtender

                                    ID="FilteredTextBoxExtender3"

                                    runat="server"

                                    TargetControlID="txtText3"

                                    FilterType="Custom, numbers"

                                    ValidChars="-">

        </cc1:FilteredTextBoxExtender> 

    </form>

</body>

</html>



3개의 TextBox 컨트롤을 웹 폼에 위치시키고, 또한, 3개의 FilteredTextBoxExtender 컨트롤을 위치시킨 후 각각의 FilteredTextBoxExtender 컨트롤의 TargetControlID를 TextBox 컨트롤의 ID로 지정합니다. 첫 번째 TextBox 컨트롤에는 숫자만 들어가게 하도록, FilteredTextBoxExtender1의 FilterType 속성을 "Numbers"로 정의하고, 두 번째 TextBox 컨트롤에는 소문자만 들어가게 하도록, FilteredTextBoxExtender2의 FilterType 속성을 "LowercaseLetters"로 정의합니다. 또한, 세 번째 TextBox 컨트롤에는 전화번호나 우편번호처럼 숫자와 숫자 사이에 "-" 문자만 들어갈 수 있도록 FilteredTextBoxExtender3의 FilterType 속성을 "Custom, Numbers"로 지정하고, ValidChars 속성을 "-"로 정의합니다.

이제, 웹 브라우저에서 확인해보면 각 FilteredTextBoxExtender 컨트롤에 정의된 FilterType에 맞는 문자 또는 숫자만 각 TextBox 컨트롤에 입력되는 것을 확인할 수 있습니다.



그림 1. FilteredTextBoxExtender 컨트롤이 정의된 TextBox 컨트롤

이상으로 FilteredTextBox 컨트롤에 대해서 알아보았고, 다음 포스트에서 다른 AJAX 컨트롤에 대해서 알아보도록 하겠습니다.


출처 : http://blog.naver.com/handssjh?Redirect=Log&logNo=140041393735&vid=0
AND

1. 자바 스크립트 함수를 폼의 HTML 부분에 먼저 추가 해둡니다.

2. 버튼에 이벤트 핸들러를 추가합니다.

3. 이벤트 핸들러 함수에 다음을 추가합니다.

   RegisterClientScriptBlock("ButtonClickTest", "<script>aaa();</script>");
   RegisterStartupScript("ButtonClickTest", "<script>aaa();</script>");


위 코드 두줄 중 하나만 쓰시면 원하는 결과를 얻으실 수 있습니다.


회색 글자 부분은 아무 값이나 넣으시면 되고, 빨간색 글자 부분에 스크립트 호출하는 코드를 넣으시면 됩니다. 빨간색 부분은 문자열이 그대로 사용되므로 자바스크립트 함수를 호출하려면 <script> ... </script> 블럭으로 감싸주셔야 합니다.


위 두 함수는 PostBack 시점에서 스크립트를 실행하기 위해서 사용합니다.

두 함수의 차이점은 RegisterClientScriptBlock 함수는 서버 Form 시작 부분의 바로 아래줄에 생성되고, RegisterStartupScript 함수는 서버 Form 닫히는 부분의 바로 윗줄에 생성됩니다.

AND

보안통신 ActiveX vs SSL

WEB 2007. 3. 19. 04:58
공인인증서와 ActiveX 컨트롤 부분에 대한 이해를 돕기 위해 왕수용씨께서 쓰신 글을 올립니다.
공인인증서와 ActiveX 컨트롤을 왜 도입했는지 그 이유에 대해 자세하게 설명이 돼 있습니다. 도움이 되셨으면 합니다.

----------------------

해외에서는 SSL의 보안통신만을 이용해 온라인 금융거래를 하는 반면, 국내에서는 디지털 개인 신분증인 공인인증서를 이용한 실체 확인을 이용하기 때문에 단순히 보안이 된 연결을 통해서 계좌번호와 비밀번호만을 입력하는 것으로 끝나지 않고, 개인에게 발급한 공인인증서를 통한 전자서명을 거쳐야만 하도록 하고 있다. 이것은 우리나라만이 고안한 특수한 방법은 아니라 전세계적으로 나아갈 방향으로 생각하고 있으나 모든 개개인에게 공인인증서를 발급하는 것이 현실적이지 않는 상황에서 우리나라에서는 적극적으로 추진한 결과이다.

하지만, 해외 특히 미국에서는 아직 일반화 되지 않았기 때문에 개인 인증서를 통한 개인 실체 확인 작업이 아직 브라우저에서는 원활하게 지원되고 있지 않은 상황이다. 따라서 개인인증서를 인터넷 연결을 통해서 금융기관에 전달하는 방법이 일반 웹브라우저에서는 지원이 되지 않기 때문에 ActiveX 기술을 이용해 웹브라우저의 기능을 확장하는 방법을 통했다. 이것이 바로 매킨토시 환경에서 금융거래를 힘들게 하는 큰 장벽으로 남아버렸다. 이것은 몇몇분들이 Windows만을 위해서 이렇게 구성했다는 억측과는 달리, 전자금융을 앞당기기 위한 어쩔수 없는 선택으로 봐야하며, ActiveX 기술만을 이용한 웹브라우저 확장뿐 아니라, Mozilla Plugin, Safari Plugin, Java Applet 등의 여러 형태로 개발함으로써 극복이 가능한 것이다.

또한, 우리나라에서 전자금융을 시도할 당시 미국에서는 64비트 이상의 암호화 기법에 대한 수출이 엄격히 금지되고 있었다. 즉, 64비트급으로 암호화를 할 경우 대형 슈퍼컴퓨터나, 일반 PC를 연결해서 계산할 경우 손쉽게 암호를 깰 수 있기 때문에, 기타국가의 정보가 암호화되어 미국 정보기관에서 알 수 없게 되는 것을 우려한 결과였다. 이러한 현실 때문에 국내에서는 자체 128비트 암호화 기술을 KISA에서 직접 개발하였으니, 이것이 SEED 암호화 기법이다. 따라서, 국내 금융거래에서는 이 SEED 암호화 기법이 이용된다. 물론 현재에 와서는 128비트 암호화 기법에 대한 수출금지조항이 풀렸지만(아직도 적성국가 7개국에 대해서는 규제를 하고 있음), 여전히 국내 금융거래에서는 SEED 암호화 기법이 이용되고 있다.

전자상거래에서의 ActivX 컨트롤 사용은, 위에서 설명한 것과 같이, 초기 브라우저의 64비트 암호화 제약으로부터 시작하였다. 하지만, 128비트 암호화가 허용되기 시작하면서도 여전히 필요성이 남은 것은, 바로 불량 상점 때문이었다. SSL을 이용한 전자거래에서는 사용자 브라우저와 상점서버간의 보안만을 보장해 준다. 따라서 이 안전한 보안 통신을 통해서 사용자 브라우저에서 상점으로 자신의 카드번호와 비밀번호를 알려준다고 하더라도, 문제는 이 상점 서버를 믿을 수 없다는 것이다. 예전에 한참 문제가 된 적도 있었지만, 상점 서버가 해킹(혹은 상점주의 부도덕)에 의해 사용자의 신용정보가 고스란히 노출 된 수 있다는 문제점이 발생한다. 이러한 문제점을 해결하기 위해서 ActiveX 컨트롤을 통해서 PG(전자결재 대행업체)와 브라우저와 직접 통신을 통해서 결재를 진행하고 그 결과만을 상점서버에 전송하는 형태로 발전하였다.

또한, 전자상거래가 발달하고, 카드 도용이 문제가 되자 전재결재 시에도 실체인증이 필요하다는 의견이 대두하였다. 즉, 브라우저상에서 카드결재를 하는 사람이 단지 카드번호만 아는 사람인지, 실제로 카드 소유자인지 확인이 필요하다는 것이다. 이 해결방법이 바로 인터넷뱅킹에서 이미 사용중인 공인 인증서를 이용한 실체확인과정이다. 이를 위해서, 위 전자결재과정에서 BC, 국민카드에서는 ISP 결재 라는 이름으로 ‘한국사이버페이먼트’사를 통한 실체확인을 거쳐 결재가 일어나고, 나머지 대다수의 카드는 비자카드사의 ‘안심클릭’을 통해서 실체확인 과정을 거쳐서 PG를 통한 결재가 이루어지게 된다.
AND

XHTML
http://validator.w3.org

CSS
http://jigsaw.w3.org/css-validator/

XML
http://www.stg.brown.edu/service/xmlvalid/

IABF 정보통신 접근성 향상 표준화 포럼
웹 접근성 평가 및 수정도구 KADO-WAH
http://www.iabf.or.kr/web/kadowah.asp
AND

출처 : http://blog.naver.com/whycry11/80029925561


1. 개념잡기

일반화 시킨 표현. 이것을 정규표현이라고 요약할 수 있을 것 같다.
다음의 과정을 너무 쉽다 생각말고 따라오길 바란다.

- 감잡기

"12354" -> 숫자
"asdfasf" -> 알파벳
두 가지의 간단정규표현을 만들었다. 실생활의 보기와 비추어보자.
"길이가 3인 이름!"
위의 표현은 길이를 표시하는 방법이 없다. 조금 더 발전시켜서 "알파벳{3}"이런식
으로 길이를 표현할 수 있도록 한다. 그리고, "알파벳"란 것도 너무 길다 "알"
이라고 한 글자로 표현한다. 그러면 "길이가 3인 이름"은
"알{3}"으로 표시가 가능하다.
길이가 10인 숫자는 "수{10}"
"길이가 1인 알파벳이 나오고 그 다음에 길이가 3인 숫자가 나오는 문자열"! ->
"알{1}수{3}"얼핏이나마 감이 올 것이다.
"첫 글자는A, 그 다음은 아무 알파벳 5글자" -> "A알{5}"

- 조금 더

아이디는 대개 첫 글자는 영문이고 두 번째부터는 영문이나 숫자가 온다. 이것을
표현하기 위해선 이것 들 중에 하나란 의미를 갖는 새로운 표현이 필요하다.
"a,b,c,d 중에 하나" -> [abcd]
응용하면,
"알파벳이나, 숫자중 하나" -> [알수]
"[" 안에 있는 문자들의 순서는 의미가 없으며, 그 표현은 (클래스라고 한다.)  
결국 한 글자를 말한다.
위에서 말한 "첫 글자는 영문, 두 번째 부터는 영문이나 숫자가 11자"를
표현하면, "알[알수]{11}".
그런데, 실제로 모든 아이디가 12자인 것은 아니다, 대개 4자부터 12자를 지원한다.
새로운 표현이 등장한다. "몇 자부터 몇 자"
"A가 3글자부터 12자" -> "A{3,12}"
"알파벳이나 숫자가 1자부터 100자" -> "[알수]{1,100}"
이제 아이디를 다시 정의하자.
"첫 글자는 영문, 영문이나 숫자가 3자부터 11자" -> "알[알수]{3,11}"

2. 표현식

지금 까지의 규칙에서 설명한 용어를 실제 정규표현에서 사용하는 표현으로 바꾸고,
다른 세부적인 옵션에 대해 알아보자.

\ : 다음의 글자가 특별한 문자임을 나타낸다. 때론, 그 다음 문자 자체를 의미하기
도 한다.
보기를 들면, "\n"은 문자"\"과 문자"n" 두 글자와 매치되는 것을 의미하는 것이 아
닌,
새줄(New Line)을 의미하며, "\\"은 첫 "\" 다음 문자인 "\" 자체를 의미한다.
즉, "\\"은
"\"과 매칭된다.

^ : 입력문자열의 맨 처음을 의미한다. (맨 첫 글자가 아니라, 맨 처음이란 문맥적 의
미를
말한다. 아주 중요하다) 기본적으로 정규표현은 입력 문자열의 한 줄에만 적용된다.
하지만, 옵션에 따라 여러줄에 적용할 수도 있다. 그럴 경우에는 "^"는  "\n"
나 "\r"
다음의 위치를 의미한다.

$ : "^"는 반대로 입력 문자열의 맨 끝을 의미한다. 역시 여러줄에 정규표현이 적용

경우에는 "\n"이나 "\r"의 앞의 위치를 의미한다.

* : 이 문자 앞의 표현이 0번내지 무한번 반복될 수 있음을 말한다.
보기를 들면, /a*/은 "a", "", "aaaa", "aaaaa"와 매칭된다.
(0번이상은 없어도 된다는 것을 의미한다.)

+ : *와 같지만, 0번이상이 아니라 1번이상이라는 점을 제외하곤 /*/와 같다.

? : 앞의 표현이 0번 또는 1번. /do(es)?/는 "do", "does"와 매칭된다.

{n} : 앞의 표현이 n은 음수가 아닌 정수이어야 하며, 앞의 표현이
n번 매치되는 것을 말한다.

{n,} : 앞의 표현이 n은 음수가 아닌 정수이어야 하며, n번 이상
매치되는 것을 말한다.

{n,m} : 앞의 표현이 n번 이상 부터 m번 이하까지 매칭되는 것을
말하며, /*/는 /{0,}/과 같으며, /+/는 /{1,}/과 /?/는 /{0,1}/으로
표현 가능하다.

. : "\n"을 제외한 한 글자를 뜻한다. 만일 모든 글자를 표현하고
싶다면("\n"마저도 합친) /[.\n]/을 사용하면 된다.

x|y : x 또는 y와 매칭된다. 보기를 들면, /z|food/는 "z" 또는
"food"와 매칭된다. /(z|f)ood/는 "zood" 또는 "food"와 매칭된다.
(참고로 괄호는 묶어준 것 이상의 의미가 있다.)

(패턴) : 해당 패턴과 매칭시키고, 그 부분을 특정 변수에 담는다.
그 변수 이름은 JScript는 $0~$9까지의 변수에 저장이 되고(Perl과 같다.),
VBScript에서는 SubMatches 컬렉션에 저장된다.
괄호기호 자체와 매치시키고 싶다면? /\(/와 /\)/를 사용한다.

(?:패턴) : 해당 패턴과 매칭은 시키지만, 그 부분을 특정 변수에
담지 않는다. 왜 이게 필요할까?
위의 보기에서 /(z|f)ood/는 "zood" 또는 "food"와 매칭된다고 했는데,
단순히 매칭의 목적으로 사용했지만, "zood"의 경우 "z"가 $0 이란
변수에 저장이 되고 말았다. 이러한 것을 막기 위해서 사용하는 것이
(?:패턴)이다.

(?=패턴) : (?:패턴)과 동일하지만, 패턴과 일치한 부분이후부터
다음 매치가 일어나지 않고 패턴 앞부터 다시 매칭이 진행된다.
즉, 룩업(lookup, lookahead)을 할 뿐이다. /Windows (?=95|98|NT|2000)/ 은
"Windows 2000"의 "Windows" 부분과 매칭이 되며 다음 매칭은
"2000" 다음 부터가 아닌 "Windows" 다음 부터 진행이 된다.

(?!패턴) : (?=패턴)과 반대다. /Windows (?=95|98|NT|2000)/ 은
"Windows 3.1"의 "Windows" 부분과 매칭이 된다.

[xyz] : "["안에 있는 표현중 하나를 의미한다.

[^xyz] :  "["안에 있는 표현을 제외한 것중 하나를 의미한다.
"[^abc]"는 "plain"의 "p"때문에 매칭된다.

[a-z] : "a"부터 "z" 까지의 문자중 하나

[^a-z] : "a"부터 "z" 까지의 문자를 제외한 하나

\b : 단어의 경계(단어와 공백, "\n", "\r"의 사이)와 매칭된다.
보기를 들면, "er\b"는 "never"와는 매칭되지만, "verb"와는 매칭되지 않는다.

\B : 단어의 경계가 아닌 것과 매칭된다. "er\B"는 "verb"와는
매칭되지만, "never"와는 매칭되지 않는다.

\cx : Ctrl+x 키와 매칭된다. "\cc"는 Ctrl+C와 매칭된다. x의 범위는
[a-zA-Z]이며, 만일 이 이외의 문자를 사용한다면 "\c"는 "c"와 동일하다.

\d : [0-9]와 같다.

\D : [^0-9]와 같다. 참고로 대문자는 소문자의 반대 의미를 갖는다.

\f : 폼피드(form-feed) 문자를 의미하며, "\x0c"와 "\cL"과 동일하다.

\n : 새 줄(newline)를 의미하며, "\x0a"와 "\cJ"와 동일하다.

\r : 캐리지 리턴(carriage return)을 의미하며, "\x0d"와 "\cM"과 동일하다.

\t : 탭. "\x09", "\cI"과 동일

\v : 버티컬 탭. "\x0b", "\cK"과 동일

\s : 화이트스페이스를 의미한다. 화이트스페이스란 공백, 탭, 폼피드,
캐리지리턴등을 의미한다. [ \f\n\r\t\v]과 동일("\f"앞에 공백이 있다. 주의!)

\S : "[^ \f\n\r\t\v]"

\w : "_"를 포함한 일반적인 단어에 사용되는 문자를 말한다.
"[A-Za-z0-9_]" 과 동일

\W : "[^A-Za-z0-9_]"

\xn : n은 2자리 16진수이며, 해당 16진수 코드와 매칭된다. "\x412"는 16진수
41은 "A"이기 때문에 "A2"와 매칭된다.

\num : 캡쳐한 매칭을 가리킨다(백레퍼런스, backreference).
"(.)\1"은 연속된 두개의 문자열을 의미한다.
\n : "\1"은 위에서 캡쳐한 매칭(backreference)를 가리킨다고 했는데,
만일 이 패턴앞에 어떠한 n개의 캡쳐한 표현이 있다면 백레퍼런스이지만,
그렇지 않은 경우에는 8진수로 간주하여 해당 코드의 문자와 매칭된다.

\un : n은 4자리 UNICODE 이다. "\u00A9"은 copyright 심볼인 "ⓒ"와 매칭된다.


greedy, non-greedy

? : 앞에서 설명했는데, 왜 또? 라고 생각할 것이다.
?은 문맥에 따라 특별한 의미를 갖는다.
패턴 "o*"는 "foooood"와 매칭된다. 당연하다! 하지만, "f"앞의 "o"와
매칭되는 것이 아니다!! "ooooo"와 매칭된 것이다. 즉, 기본으로
정규표현 매칭은 가장 큰 범위를 선택한다. 이것을 greedy하다고 한다.
하지만, 때론 작은 범위에 매칭시킬 필요가 있을 경우가 있다.
(이의 적절한 보기는 잠시 후에 나온다.) "o*?"가 방금 말한
non-greedy 매칭이다.
수량관련 문자인 "*", "+", "?", "{n}", "{n,}", "{n,m}" 다음에 "?"가
나오면 non-greedy 매칭이된다.
잠시, 위에서 "o*?"가 "o"와 매칭된다고 했는데 이상하게 생각한 분이
있었을 것이다. 맞다. "o*?"는 ""와 매칭되었다. "*"는 0개이상임을
잊어선 안된다. "o+?"가 "o"와 매칭된다.

4. 보기

- 웹 주소

"
http://msdn.microsoft.com:80/scripting/default.htm"
위의 주소를 표현할 수 있는 정규표현은 아래와 같다.
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/
$1 : http
$2 : msdn.microsoft.com
$3 : 80
$4 : /scripting/default.htm

- 중복된 단어를 하나로

중복된 영어단어를 하나로 합치기 위해선, 우선 단어를 찾아야한다.
그리고 단어는 앞 뒤가 단어의 경계이어야한다. (말이 참 이상하지만..)
따라서, 아래와 같은 1차 정규표현을 얻을 수 있다.

/\b([a-z]+)\b/

연속해서 동일한 두개의 단어... 앞에서 캡쳐한 표현을 다시 활용하면 된다.
그리고, 단어와 단어 사이엔 화이트스페이스가 있다.

/\b([a-z]+)\s+\1\b/

- HTML 태그 제거

HTML문서에서 태그를 제거한 문서를 추출하고자 한다.
태그는 "<"와 ">"로 감싸여 있다.

/<.*>.*</.*>/

그런데, 위의 정규표현을 HTML문서에 적용하여 해당 패턴을 "",
빈문자열로 바꾸면 문서는 빈 문서가 되고 만다.

<html>
<title>...</title>
<body>
<font>.... </font>
...
</body>
greedy한 매칭이 기본값이라고 위에서 언급을 했다. 따라서,
위의 HTML 문서를 보면, <html>....</body>로 생각할 수 있다.
따라서, 문서 전체가 사라지는 것이다. 이것을 막기 위해선 "*"뒤에 "?"를
추가하면 된다.                          

/<.*?>.*?</.*?>/

아직 끝나지 않았다. :)

좀더 정제를 한다면, 올바른 HTML 문서는 <태그명>과 </태그명>이
서로 일치한다. 이것도 적용한다면,

/<.(*?)>.(*?)</\1>/

위의 $1에 해당되는 부분을 좀 더 생각해보면, ">"를 제외한 문자로
볼 수 있다. 따라서 최종적으로 아래와 같이 정리된다.

/<(\w+)[^>]*?>(.*?)</\1>/

- URL

/(?:^|")(http|ftp|mailto):(?://)?(\w+(?:[\.:@]\w+)*?)(?:/|@)([^"\?]*?)(?:\?
([^\?"]*?))?(?:$|")/

- float 상수

/^(((+|-)?\d+(\.\d*)?)|((+|-)?(\d*\.)?\d+))$/  -1.1 1.1 .9 .8


정규식 구문

정규식은 일반 문자(예: a에서 z)와 메타문자 로 알려진 특수 문자로 구성된 텍스트 패턴입니다. 패턴은 텍스트 본문을 검색할 때 일치하는 문자열을 하나 이상 설명합니다. 정규식은 검색되는 문자열과 일치하는 문자 패턴을 찾는 템플릿의 역할을 합니다.

일반적으로 볼 수 있는 몇 가지 정규식 예는 다음과 같습니다.

JScript VBScript 검색

/^\[ \t]*$/ "^\[ \t]*$" 빈 줄을 찾습니다.
/\d{2}-\d{5}/ "\d{2}-\d{5}" 2자리, 하이픈 및 5자리로 구성된 ID 번호를 찾습니다.
/<(.*)>.*<\/\1>/ "<(.*)>.*<\/\1>" HTML 태그를 찾습니다.

아래 표는 정규식 컨텍스트에 사용되는 모든 메타문자와 메타문자의 동작을 보여줍니다.

문자 설명

\ 그 다음 문자를 특수 문자, 리터럴, 역참조, 또는 8진수 이스케이프로 표시합니다. 예를 들어, "n"은 문자 "n"을 찾고 "\n"은 줄 바꿈 문자를 찾습니다. "\\" 시퀀스는 "\"를 찾고 "\("는 "("를 찾습니다.
^ 입력 문자열의 시작 위치를 찾습니다. Multiline 속성이 설정되어 있으면 ^는 '\n' 또는 '\r'앞의 위치를 찾습니다.
$ 입력 문자열의 끝 위치를 찾습니다. Multiline 속성이 설정되어 있으면 $는 '\n' 또는 'r'뒤의 위치를 찾습니다.
* 부분식의 선행 문자를 0개 이상 찾습니다. 예를 들어, "zo*"는 "z", "zoo" 등입니다. *는 {0,}와 같습니다.
+ 부분식의 선행 문자를 한 개 이상 찾습니다. 예를 들어, "zo+"는 "zo", "zoo" 등이지만 "z"는 아닙니다. +는 {1,}와 같습니다.
? 부분식의 선행 문자를 0개 또는 한 개 찾습니다. 예를 들어, "do(es)?"는 "do" 또는 "does"의 "do"를 찾습니다. ?는 {0,1}과 같습니다.
{ n } n 은 음이 아닌 정수입니다. 정확히 n 개 찾습니다. 예를 들어, "o{2}"는 "Bob"의 "o"는 찾지 않지만 "food"의 o 두 개는 찾습니다.
{ n ,} n 은 음이 아닌 정수입니다. 정확히 n 개 찾습니다. 예를 들어, "o{2}"는 "Bob"의 "o"는 찾지 않지만 "foooood"의 모든 o는 찾습니다. "o{1,}"는 "o+"와 같고, "o{0,}"는 "o*"와 같습니다.
{ n , m } m n 은 음이 아닌 정수입니다. 여기서 m n 보다 크거나 같습니다. 최소 n 개, 최대 m 개 찾습니다. 예를 들어, "o{1,3}"은 "fooooood"의 처음 세 개의 o를 찾습니다. "o{0,1}"은 "o?"와 같습니다. 쉼표와 숫자 사이에는 공백을 넣을 수 없습니다.
? 이 문자가 다른 한정 부호(*, +, ?, { n }, { n ,}, { n , m }) 의 바로 뒤에 나올 경우 일치 패턴은 제한적입니다. 기본값인 무제한 패턴은 가능한 많은 문자열을 찾는 데 반해 제한적인 패턴은 가능한 적은 문자열을 찾습니다. 예를 들어, "oooo" 문자열에서 "o+?"는 "o" 한 개만 찾고, "o+"는 모든 "o"를 찾습니다.
. "\n"을 제외한 모든 단일 문자를 찾습니다. "\n"을 포함한 모든 문자를 찾으려면 '[.\n]' 패턴을 사용하십시오.
( pattern ) pattern 을 찾아 검색한 문자열을 캡처합니다. 캡처한 문자열은 VBScript의 경우 SubMatches 컬렉션, Jscript의 경우 $0 ... $9 속성을 이용하여 결과로 나오는 Matches 컬렉션에서 추출할 수 있습니다. 괄호 문자인 ( )를 찾으려면 "\(" 또는 "\)"를 사용하십시오.
(?: pattern ) pattern 을 찾지만 검색한 문자열을 캡처하지 않습니다. 즉, 검색한 문자열을 나중에 사용할 수 있도록 저장하지 않는 비캡처 검색입니다. 이것은 패턴의 일부를 "or" 문자(|)로 묶을 때 유용합니다. 예를 들어, 'industr(?:y|ies)는 'industry|industries'보다 더 경제적인 식입니다.
(?= pattern ) 포함 예상 검색은 pattern 과 일치하는 문자열이 시작하는 위치에서 검색할 문자열을 찾습니다. 이것은 검색한 문자열을 나중에 사용할 수 있도록 캡처하지 않는 비캡처 검색입니다. 예를 들어, "Windows(?=95|98|NT|2000)"는 "Windows 2000"의 "Windows"는 찾지만 "Windows 3.1"의 "Windows"는 찾지 않습니다. 예상 검색은 검색할 문자열을 찾은 후 예상 검색 문자열을 구성하는 문자 다음부터가 아니라 마지막으로 검색한 문자열 바로 다음부터 찾기 시작합니다.
(?! pattern ) 제외 예상 검색은 pattern 과 일치하지 않는 문자열이 시작하는 위치에서 검색할 문자열을 찾습니다. 이것은 검색한 문자열을 나중에 사용할 수 있도록 캡처하지 않는 비캡처 검색입니다. 예를 들어, "Windows(?!95|98|NT|2000)"는 "Windows 3.1"의 "Windows"는 찾지만 "Windows 2000"의 "Windows"는 찾지 않습니다. 예상 검색은 검색할 문자열을 찾은 후 예상 검색 문자열을 구성하는 문자 다음부터가 아니라 마지막으로 검색한 문자열 바로 다음부터 찾기 시작합니다.
x | y x 또는 y 를 찾습니다. 예를 들어, "z|food"는 "z" 또는 "food"를 찾습니다. "(z|f)ood"는 "zood" 또는 "food"를 찾습니다.
[ xyz ] 문자 집합입니다. 괄호 안의 문자 중 하나를 찾습니다. 예를 들어, "[abc]"는 "plain"의 "a"를 찾습니다.
[^ xyz ] 제외 문자 집합입니다. 괄호 밖의 문자 중 하나를 찾습니다. 예를 들어, "[^abc]"는 "plain"의 "p"를 찾습니다.
[ a-z ] 문자 범위입니다. 지정한 범위 안의 문자를 찾습니다. 예를 들어, "[a-z]"는 "a"부터 "z" 사이의 모든 소문자를 찾습니다.
[^ a-z ] 제외 문자 범위입니다. 지정된 범위 밖의 문자를 찾습니다. 예를 들어, "[^a-z]"는 "a"부터 "z" 사이에 없는 모든 문자를 찾습니다.
\b 단어의 경계, 즉 단어와 공백 사이의 위치를 찾습니다. 예를 들어, "er\b"는 "never"의 "er"는 찾지만 "verb"의 "er"는 찾지 않습니다.
\B 단어의 비경계를 찾습니다. "er\B"는 "verb"의 "er"는 찾지만 "never"의 "er"는 찾지 않습니다.
\c x X 가 나타내는 제어 문자를 찾습니다. 예를 들어, \cM은 Control-M 즉, 캐리지 리턴 문자를 찾습니다. x 값은 A-Z 또는 a-z의 범위 안에 있어야 합니다. 그렇지 않으면 c는 리터럴 "c" 문자로 간주됩니다.
\d 숫자 문자를 찾습니다. [0-9]와 같습니다.
\D 비숫자 문자를 찾습니다. [^0-9]와 같습니다.
\f 폼피드 문자를 찾습니다. \x0c와 \cL과 같습니다.
\n 줄 바꿈 문자를 찾습니다. \x0a와 \cJ와 같습니다.
\r 캐리지 리턴 문자를 찾습니다. \x0d와 \cM과 같습니다.
\s 공백, 탭, 폼피드 등의 공백을 찾습니다. "[ \f\n\r\t\v]"와 같습니다.
\S 공백이 아닌 문자를 찾습니다. "[^ \f\n\r\t\v]"와 같습니다.
\t 탭 문자를 찾습니다. \x09와 \cI와 같습니다.
\v 수직 탭 문자를 찾습니다. \x0b와 \cK와 같습니다.
\w 밑줄을 포함한 모든 단어 문자를 찾습니다. "[A-Za-z0-9_]"와 같습니다.
\W 모든 비단어 문자를 찾습니다. "[^A-Za-z0-9_]"와 같습니다.
\x n n 을 찾습니다. 여기서 n 은 16진수 이스케이프 값입니다. 16진수 이스케이프 값은 정확히 두 자리여야 합니다. 예를 들어, '\x41'은 "A"를 찾고 '\x041'은 '\x04'와 "1"과 같습니다. 정규식에서 ASCII 코드를 사용할 수 있습니다.
\ num num 을 찾습니다. 여기서 num 은 양의 정수입니다. 캡처한 문자열에 대한 역참조입니다. 예를 들어, '(.)\1'은 연속적으로 나오는 동일한 문자 두 개를 찾습니다.
\ n 8진수 이스케이프 값이나 역참조를 나타냅니다. \ n 앞에 최소한 n개의 캡처된 부분식이 나왔다면 n 은 역참조입니다. 그렇지 않은 경우 n 이 0에서 7 사이의 8진수이면 n 은 8진수 이스케이프 값입니다.
\ nm 8진수 이스케이프 값이나 역참조를 나타냅니다. \ nm 앞에 최소한 nm개의 캡처된 부분식이 나왔다면 nm 은 역참조입니다. \ nm 앞에 최소한 n개의 캡처가 나왔다면 n 은 역참조이고 뒤에는 리터럴 m이 옵니다. 이 두 경우가 아닐 때 n과 m이 0에서 7 사이의 8진수이면 \ nm 은 8진수 이스케이프 값 nm을 찾습니다.
\ nml n 이 0에서 3 사이의 8진수이고 m l 이 0에서 7 사이의 8진수면 8진수 이스케이프 값 nml 을 찾습니다.
\u n n 은 4 자리의 16진수로 표현된 유니코드 문자입니다. 예를 들어, \u00A9는 저작권 기호(©)를 찾습니다.



--------------------------------------------------------------------------------
Visual Basic Scripting Edition에서 정규 표현식 기능 이용하기
--------------------------------------------------------------------------------

정규 표현식이란 무엇인가요?
정 규 표현식이란 무엇일까요? 정규 표현식은 복잡한 패턴 매칭 기능과 텍스트형 검색-대체 알고리즘을 개발할 수 있는 툴을 제공합니다. Perl, egrep, awk, 또는 sed 개발자에게 정규 표현식이 무엇이냐고 물어보면, 정규 표현식은 텍스트와 데이터를 조작 할 때 사용할 수 있는 가장 강력한 유틸리티라고 대답할 것입니다. 개발자는 패턴을 만들어 특정 문자열을 매치키시킴으로써 데이터를 검색하거나 추출하거나 교체하는 일을 완벽하게 제어할 수 있습니다. 간단히 말해서, 정규 표현식을 정복하면 데이터도 정복할 수 있는 것입니다.

여기서는, VBScript 정규 표현식과 관련된 모든 개체를 설명하고, 일반적인 정규 표현식 패턴을 간략하게 살펴보고, 실제 코드로 정규 표현식을 사용하는 예를 들어보도록 합시다.

VBScript RegExp 개체
VBScript 5.0 버전은 정규 표현식을 하나의 개체로서 제공합니다. VBScript RegExp 개체는 설계 면에서 JScript의 RegExp 및 String 개체와 비슷하고, 구문 면에서는 Visual Basic과 일치합니다. 먼저, VBScipt RegExp 개체의 속성 과 메소드에 관해 알아봅시다. VBScript RegExp 개체는 사용자에게 세 개의 속성과 세 개의 메소드를 제공합니다.

속성  메소드  
Pattern Test(검색-문자열)  
IgnoreCase  Replace (검색-문자열, 대체-문자열)  
Global  Execute (검색-문자열  

Pattern - 정규 표현식을 정의하는 데 사용되는 문자열. 이 속성은 정규 표현식 개체를 사용하기 전에 먼저 설정해야 합니다. Pattern에 관한 내용은 아래에 자세히 설명되어 있습니다.
IgnoreCase - 문자열 안에서 일치하는 문자가 발생할 모든 가능성에 대해 정규 표현식을 테스트해야 하는지를 나타내는 부울 논리 속성입니다. IgnoreCase의 기본 설정 값은 False입니다.
Global - 문자열 안에서 일치하는 문자가 발생할 모든 가능성에 대해 정규 표현식을 테스트해야 하는지 여부를 나타내는 읽기 전용 부울 논리 속성입니다. Global의 기본 설정 값은 False입니다.
Test (문자열) - Test 메소드는 문자열을 매개 변수로 받아 그 문자열이 정규 표현식에 일치하면 True를 반환하고 그렇지 않으면 False를 반환합니다.
Replace (검색-문자열, 대체-문자열) - Replace 메소드는 두 개의 문자열을 매개 변수로 받습니다. 검색-문자열 안에 정규 표현식과 일치하는 문자열이 있으면, 그 문자열을 대체-문자열로 바꾸고, 바뀐 새로운 문자열을 반환합니다. 만일 일치하는 문자열이 없으면, 원래의 검색-문자열을 반환합니다.
Execute (검색-문자열) - Execute 메소드는 Matches 컬렉션 개체를 반환하는 점만 제외하면 Replace 메소드의 작동과 비슷합니다. Matches 컬렉션 개체에는 정규 표현식에 일치하는 각 문자열 에 대한 Match 개체가 들어 있습니다. 이 메소드는 원래의 문자열을 변경하지 않습니다.
더 자세한 내용과 예제 코드는,Microsoft Scripting Site  사이트를 참고하시기 바랍니다.

VBScript Matches 컬렉션 개체
앞에서 말했듯이, Matches 컬렉션 개체는 Execute 메소드를 실행한 경우에만 반환됩니다. 이 컬렉션 개체는 0개 이상의 Match 개체를 포함할 수 있으며, 이 개체의 속성은 읽기 전용입니다.

속성  
Count  
Item  

Count -컬렉션 안에 있는 Match 개체의 개수를 나타내는 읽기 전용 값입니다.
Item - Matches 컬렉션 개체에서 Match 개체를 임의로 액세스할 수 있게 만드는 읽기 전용 값입니다. For-Next 루프를 사용하면, Matches 컬렉션 개체에서 Match 개체를 순서대로 액세스할 수도 있습니다.
더 자세한 내용과 예제 코드는, Microsoft Scripting Site  를 참고하시기 바랍니다.

VBScript Match 개체
각 Mathes 개체에는 0개 이상의 Match 개체가 들어 있습니다. 이 Match 개체들은 정규 표현식을 사용했을 때 성공적으로 일치한 문자열 을 나타냅니다. 이 개체의 속성은 읽기 전용이며 일치하는 각 문자열에 대한 정보를 저장합니다.

속성  
FirstIndex
Length  
Value  

FirstIndex - 원래 문자열 안에서 정규 표현식에 일치하는 문자열의 위치를 나타내는 읽기 전용 값입니다. 이 색인은 위치를 기록하는데 0 기준 오프셋(문장의 첫 위치가 0번째임을 뜻함)을 사용합니다.
Length - 일치된 문자열의 전체 길이를 나타내는 읽기 전용 값입니다
Value - 일치된 값이나 텍스트를 나타내는 읽기 전용 값입니다. 이 값은Match 개체를 액세스할 때 사용되는 기본 값이기도 합니다.
더 자세한 내용과 예제 코드는, Microsoft Scripting Site  를 참고하시기 바랍니다.

패턴은 어떤 형태인가?
자, 지금까지는 이 모든 것이 지나치게 훌륭하고 환상적인 것으로 느껴지셨겠지만 실제는 어떨까요? 정규 표현식은 그 자체가 하나의 언어 라고 할 수 있지만, Perl에 익숙한 사용자들이라면 누구나 쉽게 사용할 수 있습니다. VBScript는 Perl로부터 패턴 셋을 유도하기 때문에, 주요 기능도 Perl과 비슷합니다. 그러면, 정규 표현식을 정의하는 데 사용되는 패턴 셋 몇 가지를 살펴보도록 합시다. 패턴 셋은 여러 범주와 영역으로 분류할 수 있습니다.

포지션 매칭

포지션 매칭은 ^와 $ (을)를 사용하여 문자열의 시작이나 끝을 검색합니다. 패턴 속성을 "^VBScript"로 설정할 경우, "VBScript is cool."에는 일치하지만, "I like VBScript."에는 일치하지 않습니다.

기호 기능
^ 문자열의 시작만 비교합니다

"^A"는 "An A+ for Anita."의 첫번째 "A"를 비교합니다.  
$  문자열의 끝을 비교합니다.

"t$"는 "A cat in the hat"의 마지막 "t"를 비교합니다.  
\b  임의의 워드 영역을 비교합니다

"ly\B"는 "possibly tomorrow."의 "ly"를 비교합니다  
\B  Matches any non-word boundary




리터럴

리 터럴은 영숫자 문자, ASCII, 8진수 문자, 16진수 문자, UNICODE, 또는 특수 구분 문자 등을 모두 총칭하는 말입니 다. 특별한 의미를 갖고 있는 몇몇 문자는 구분해야 합니다. 이들 특수 문자를 비교하려면, 정규 표현식을 문자 앞에 \를 사용해야 합니다.

기호 기능
영숫자  영문자와 숫자를 비교합니다.  
\n  새로운 라인을 비교합니다  
\f  용지 공급을 비교합니다  
\r  캐리지 리턴을 비교합니다.
\t  가로 탭을 비교합니다.  
\v  수평 탭을 비교합니다.  
\?  ?(을)를 비교합니다.  
\*  *(을)를 비교합니다.  
\+  +(을)를 비교합니다.  
\.  . (을)를 비교합니다.  
\|  |(을)를 비교합니다.
\{  {(을)를 비교합니다.  
\}  }(을)를 비교합니다.  
\\  \(을)를 비교합니다.  
\[  [(을)를 비교합니다.  
\]  ] (을)를 비교합니다.  
\(  ((을)를 비교합니다.  
\)  ) (을)를 비교합니다.
\xxx  8진수 xxx로 표시된 ASCII 문자를 비교합니다.

"\50"은 "(" 또는 chr (40) (을)를 비교합니다.  
\xdd  16진수 dd로 표시된 ASCII 문자를 비교합니다.

"\x28"은 "(" 또는 chr (40) (을)를 비교합니다.  
\uxxxx  UNICODE xxxx로 표시된 ASCII 문자를 비교합니다.

"\u00A3"은 "&pound;"를 비교합니다.  

문자 클래스

문 자 클래스를 사용하면 괄호 [] 안에 식을 삽입하여 사용자에 의해 정의된 그룹을 만들 수 있습니다. 문자 클래스의 문자들을 제외한 나머지 문자들을 사용하려면 [] 안에 ^(을)를 첫번째 문자로 삽입해야 합니다. 또한, 문자의 범위를 지정할 때는 대시를 사용합 니다. 예를 들어, 정규 표현식 "[^a-zA-Z0-9]"(은)는 영문자와 숫자를 제외한 모든 문자를 비교합니다. 추가로 구분 문 자와 리터럴로 묶인 문자셋도 있습니다.


기호 기능
[xyz] 문자셋 안에 포함되어 있는 임의의 한 문자를 비교합니다.

"[a-e]" (은)는 "basketball" 안의 "b"를 비교합니다.
[^xyz]  문자 셋 안에 포함되어 있지 않은 임의의 한 문자를 비교합니다.

"[^a-e]"는 "basketball" 안의 "s"를 비교합니다.  
.  \n을 제외한 임의의 문자를 비교합니다.  
\w  임의의 워드 문자를 비교합니다.
[a- zA-Z_0-9]와 동일함.  
\W  워드 문자를 제외한 임의의 문자를 비교합니다.
[^a-zA-Z_0-9]와 동일함.
\d  임의의 숫자를 비교합니다. [0-9].  
\D  숫자를 제외한 임의의 문자를 비교합니다.
[^0-9]와 동일함.
\s  임의의 공백 문자를 비교합니다.
[ \t\r\n\v\f]와 동일함.  
\S  공백 문자가 아닌 임의의 문자를 비교합니다.
[^ \t\r\n\v\f]와 동일함.  

반복

반복 매칭을 사용하면 정규 표현식 안에 있는 특정 절에 대한 검색을 여러 번 수행할 수 있습니다. 반복 매칭에서는 어떤 요소가 정규 표현식 안에서 몇 번 반복될 것인지를 지정할 수 있습니다.

기호 기능  
{x}  {x} 정규 표현식을 x번 비교합니다.

"\d{5}"는 5개의 숫자를 비교합니다.
(x,}  정규 표현식을 x번 이상 비교합니다.

"\s{2,}"는 최소한 두 개의 공백 문자를 비교합니다
{x,y}  정규 표현식을 x부터 y번까지 비교합니다.

"\d{2,3}"는 2개 이상 3개 미만의 숫자를 비교합니다. . 
?  0번 또는 한 번 비교합니다. {0,1}와 동일함.

"a\s?b"는 "ab" 또는 "a b"를 비교합니다.
*  0번 이상 비교합니다. {0,}와 동일함.  
+  한번 이상 비교합니다.{1,}과 동일함.  


교체와 그룹핑

교체와 그룹핑은 보다 복잡한 정규 표현식을 만들 때 사용합니다. 교체와 그룹핑 기술은 정규 표현식 안에 복잡한 절을 만들고, 보다 많은 융통성과 제어 능력을 제공합니다.

기호 기능  
()  절을 그룹핑하여 절을 만듭니다. 중첩하여 사용할 수도 있습니다.

"(ab)?(c)"는 "abc" 또는 "c"를 비교합니다.  
|  교체는 여러 절을 하나의 정규 표현식으로 조합한 다음 개별적인 절을 비교합니다.

"(ab)|(cd)|(ef)"는 "ab" 또는 "cd" 또는 "ef"를 비교합니다.

역방향 참조

프 로그래머는 역방향 참조를 통해 정규 표현식의 일부를 다시 참조할 수 있습니다. 그 방법은 괄호와 백슬레시(\) 뒤에 한 개의 숫자 를 사용하는 것입니다. 첫 번째 괄호 절은 \1로 참조되고 두 번째 괄호 절은 \2로 참조되는 식입니다.

기호 기능  
()\n  왼쪽 괄호에 있는 표현식을 n번 반복해서 문장을 비교합니다.

"(\w+)\s+\1"는 "hubba hubba" 같이, 한 열 안에서 두 번 나타나는 임의의 워드를 비교합니다.."  

예제로 확인하기!
이 예제는 지금까지 설명한 것을 적용한 것으로, 정규 표현식을 이용하여 유효한 입력 값이 입력되어 있는지 검사하는 간단한 응용 프로그 램입니다. 사용자가 유효한 값을 입력할 때까지 사용자에게 입력을 요구하는 프롬프트가 반복적으로 나타납니다. 먼저 초기 패턴을 자세 히 설명하겠습니다.

"^\s*((\$\s?)|(&pound;\s?))?((\d+(\.(\d\d)?)?)|(\.\d\d))\s*(UK|GBP|GB|USA|US|USD)?)\s*$"

"^\s*…" 와 "…\s*$" - 앞과 뒤에 몇 개의 공백 문자든지 올 수 있음을 나타내며, 입력은 반드시 라인 자체 위에 있어야 합니다.
"((\$\s?)|(?\s?))?" - 옵션 공백 앞에 오는 옵션 $ 또는 £ 기호를 나타냅니다..
"((\ d+(\.(\d\d)?)?)|(\.\d\d))" - 생략 가능한 십진수 소수점 2자리 또는 십진수 소수점 2 자리수 앞에 오는 한 자리 이상의 숫자를 찾습니다. 이 말은 6., 23.33, .88와 같은 숫자는 사용 가능하나 5.5는 사용할 수 없음을 의미합 니다.
"\s*(UK|GBP|GB|USA|US|USD)?" - 문자열에 대하여 생략 및 사용이 가능하고 인수 앞에서 유효한 공백 문자의 수를 의미합니다.
본 예제의 경우, 정규 표현식은 사용자의 US 달러 또는 영국 파운드 입력 여부를 결정하는 데 사용됩니다. 필자는 £, UK, GBP, 또는 GB 문자열을 검색하고 있습니다. 정규 표현식 결과가 참이면 사용자는 영국 파운드 단위의 액수를 입력한 것이라고 보면 됩니다. 그렇지 않다면 USD 통화를 사용한 것이겠지요.

이 코드를 사용하려면 코드를 CurrencyEx.vbs로 저장하고 Windows Script Host를 이용해 코드를 실행시킨 다음 VB에 복사하거나(이 경 우, Microsoft VBScript 정규 표현식에 참조를 추가할 필요가 있음) HTML 파일에 코드를 포함시킵니다.

Sub CurrencyEx
Dim inputstr, re, amt
Set re = new regexp  'Create the RegExp object

'Ask the user for the appropriate information
inputstr = inputbox("I will help you convert USA and CAN currency. Please enter the amount to convert:")
'Check to see if the input string is a valid one.
re.Pattern = "^\s*((\$\s?)|(&pound;\s?))?((\d+(\.(\d\d)?)?)|(\.\d\d))\s*(UK|GBP|GB|USA|US|USD)?)\s*$"
re.IgnoreCase = true
do while re.Test(inputstr) <> true
'Prompt for another input if inputstr is not valid
inputstr = inputbox("I will help you convert USA and GBP currency. Please enter the amount to(USD or GBP):")

loop
'Determine if we are going from GBP->US or USA->GBP
re.Pattern = "&pound;|UK|GBP|GB"
if re.Test(inputstr) then
'The user wants to go from GBP->USD

re.Pattern = "[a-z$&pound; ]"
re.Global = True
amt = re.Replace(inputstr, "")
amt = amt * 1.6368
amt = cdbl(cint(amt * 100) / 100)
amt = "$" & amt
else
'The user wants to go from USD->GBP

re.Pattern = "[a-z$&pound; ]"
re.Global = True
amt = re.Replace(inputstr, "")
amt = amt * 0.609
amt = cdbl(cint(amt * 100) / 100)
amt = "&pound;" & amt
end if

msgbox ("Your amount of: " & vbTab & inputstr & vbCrLf & "is equal to: " & vbTab & amt)
End sub


더욱 강력한 파워를!
Visual Basic 개발자들이 정규 표현식을 사용할 수 있도록 VBScript 정규 표현식 엔진은 COM 개체로 구현되어 왔습니다. 이 경우, 정규 표현식은 보다 강력한 힘을 발휘하게 되는데 즉, Visual Basic 또는 C와 같은 VBScript 외의 다양한 소스로부터 호 출이 가능하기 때문입니다. 예컨대, 필자는 Outlook(R) 97, Outlook 98 또는 Outlook 2000의 접속 목록 을 통해 내용을 추적하고 특정 도시에 사는 접속자 이름을 반환하는 작은 Visual Basic 응용 프로그램을 만든 경험이 있습니 다.

이 프로그램은 매우 간단합니다. 먼저 사용자는 검색할 대상 도시명을 입력하고, 구분 표시에는 쉼표를 사용합니 다. 그런 다음, Outlook에 작성할 새 접속 폴더의 이름을 입력합니다. 각 접속이 일치하면 이 내용은 새로 작성된 접속 폴더 에 복사됩니다.

Microsoft VBScript 정규 표현식 개체 라이브러리에 참조를 추가할 경우 몇 가지 유용한 조기 바인딩 기능(early binding)을 사용할 수 있습니다. 이 조기 바인딩 개체는 몇 가지 이점을 제공하는데 즉, 속도 가 빠르고 코딩 프로그램 사용이 간편하다는 점입니다. "new RegExp"가 즉시 사용되므로 사용자는 개체에 참조를 추가하고 VBScript코드를 오려내어 VB에 그대로 붙일 수 있습니다.

이러한 이유로 필자 또한 정규 표현식과 동일한 방 법을 사용하여 Outlook 9.0 개체 라이브러리를 참조한 적이 있습니다. 물론, 여러분은 여전히 CreateObject() (을)를 사용하여 COM 호출을 생성시킬 수도 있으나 상기 방법을 더 간편하게 사용할 수 있을 것입니다. 이 개체들을 작성한 후  간단한 코드를 사용하여 도시명과 일치하는 폴더와 트리를 액세스할 수 있습니다. 본인은 2개의 모음 개체를 가지는 작은 도움 함수 compareCollectionObjects(x,y)(을)를 사용/비교하여 일치 여부를 확인합니다.

이 프로그램을 사용하려면 단순히 코드를 VB(참조 추가에 필요함)에 복사한 다음 FindCityContacts() 함수를 호출하면 됩니다. .


Sub FindCityContacts()

   Dim strTemp
   Dim index
  Dim citySearch
   Dim myNameSpace, myContacts, newCityContacts, newCityContactsName
   Dim contact
   Dim newContact

   'Set the early binding objects
   Dim re as New RegExp  
   Dim myApp as New Outlook.Application

   re.Global = True
   re.IgnoreCase = True

   citySearch = InputBox("Please enter the cities of your search, separated by commas.")
   newCityContactsName = InputBox("Please enter the new contact folder name")

   'Set some of the objects and create the new Contacts folder
   Set myNameSpace = myApp.GetNamespace("MAPI")
  'olFolderContacts = 10
   Set myContacts = myNameSpace.GetDefaultFolder(10)  
   Set newCityContacts = myContacts.Folders.Add(newCityContactsName)

   'Set cities, using regular expressions to contain the city names
   re.Pattern = "[^,]+"
  Set cities = re.Execute(citySearch)
   For Each city In cities

      'Set citytokens to be the individual tokens in the city name
      'Then we compare them to the address tokens in each contact
       re.Pattern = "[^ ]+"
       Set citytokens = re.Execute(city)

       For i = 1 to myContacts.Items.Count
           re.Pattern = "[^ ]+"
           Set contact = myContacts.Items.Item(i)

           Set HomeAddressCityTokens = re.Execute(contact.HomeAddressCity)
           If compareCollectionObjects(HomeAddressCityTokens, citytokens) = 1 Then

               Set newContact = contact.Copy
               newContact.Move newCityContacts
           End If

           Set OtherAddressCityTokens = re.Execute(contact.OtherAddressCity)
           If compareCollectionObjects(OtherAddressCityTokens, citytokens) = 1 Then
               Set newContact = contact.Copy
               newContact.Move newCityContacts
           End If

           Set BusinessAddressCityTokens = re.Execute(contact.BusinessAddressCity)
          If compareCollectionObjects(BusinessAddressCityTokens, citytokens) = 1 Then
               Set newContact = contact.Copy
              newContact.Move newCityContacts
           End If
       Next
  Next

MsgBox "done"

End Sub

'This function is provided as a helper-function
' to compare two collection objects.
Function compareCollectionObjects(x, y)

   Dim index
   Dim flag
   flag = 1

   If x.Count <> y.Count Then
       flag = 0
  Else
       index = x.Count

       For i = 0 To (index - 1)
           If StrComp(x.Item(i), y.Item(i), 1) Then
               flag = 0
           End If
       Next
   End If

   compareCollectionObjects = flag

End Function


넘치는 정보!
앞 에서 보았듯이, Microsoft는 정규 표현식(버전 5.0)을 이용하여 VBSscript를 강화시키는데, 이것은 VBScript 와 Jscript 비교에서 가장 중요한 부분이었습니다. 스크립팅 엔진 버전 5.0에서 우리는 VBScript의 기능을 향상시키는 데 특히 비중을 두었습니다. 이제 여러분은 정규 표현식을 추가시킴으로써 데이터를 보다 확실하게 관리하고 그 효과를 높일 수 있게 되었으며, 클라이언트와 서버에서 보다 강력한 웹 응용 프로그램을 만들 수 있게 되었습니다.

AND

IE7 CSS Hack

WEB/CSS 2007. 3. 19. 03:33

관련내용출처 : http://nanobox.chipx86.com/blog/2006/04/easy-css-hacks-for-ie7.php

IE6 이하에 대해서는
* html { … } 와 같이 사용합니다.

IE7 이하에 대해서는
*:first-child+html { … } * html { … } 와 같이 HTML 을 선택합니다.
(두개 같이 쓰라는 말 같습니다)

IE7 에만 적용되게 하려면
*:first-child+html { … } 와 같이 HTML 을 선택합니다.

IE7 과 기타 최신의 브라우저를 위해서는 (IE6 제외)
html>body { … } 와 같이 body 를 선택합니다.

IE7 을 제외한 최신의 브라우저에는
html>/**/>body { … } 와 같이 body를 선택합니다.

AND

CSS Hack

WEB/CSS 2007. 3. 19. 03:26
이 포스팅에서 언급하고 있는 CSS핵(hack)들은 대부분 옛날 브라우저들을 대상으로 한 것들이라 아마도 활용도가 그다지 높지 않으리라 생각하지만…해외사이트에 사용하고 있는 경우가 많으므로 알아두면 해외사이트를 분석할때도 상당히 도움이 되리라 생각한다. 또 CSS핵(hack)의 사용시 많은 주의를 기울여야 하며 CSS 문법상 맞지 않는 경우도 많으므로 주의하여야 한다. 일단 웹표준에 의한 사이트 제작이 익숙해지면 브라우저의 버그를 CSS핵이 아니라 CSS구조를 이용하여 회피하는 방법도 자연스럽게 익히게 되리라 생각한다. CSS핵은 정말 피치못한 경우에만 사용해야 한다.

Netscape 4 제외시키기
Netscape 4은 media속성값에 "screen"이외의 값이 올 경우 읽어 들이지 못하는 것을 이용한 방법이다.

이나

라고 지정할 경우 Netscape 4은 읽어 들이지 못한다.
부분적으로 읽어들이지 못하게 하는 경우에는 Caio's hack인 /*/*/를 이용한다. 보통 코멘트는 */으로 닫지만 /*/으로 닫게 되면 Netscape 4에서는 인식되지 않는다. 그 뒤에 평상시의 코멘트 /* */를 적어두면 그 뒤의 스타일은 Netscape 4에서도 문제없이 적용된다.
p {
/*/*/ color:white; /* */
}
 
Mac IE 4.5, Netscape 4 제외시키기
@import룰로 url()함수를 이용하여 외부 스타일시트를 이중인용부호로 지정한다.
Mac IE 4.5는 @import에 url()함수를 이용하는 경우, 단일 인용부호와 인용부호가 없는 것이 아니면 읽어 들이지 못한다. Netscape 4은 @import를 지원하지 않는다.
@import url("/css/style.css")
 
Mac IE 5 제외시키기
CSS소스 안의 코멘트 서식을 /* */ 이라는 방식으로 기술한다. holly hack이라고 하며 그 뒤에 평상시의 코멘트 /* */를 적어두면 그 뒤의 스타일은 Mac IE 5에서도 문제없이 적용된다.
p {
/* */ color:white; /* */
}

Win IE 4~5 제외시키기
셀렉터 바로 뒤에 /**/라고 적는다.
p/**/ { color:white;}
 

Win IE 4~5, Mac IE 4.5~5 제외시키기
프로퍼티와 값을 구분하는 콜론(;) 앞에 코멘트에 스페이스를 포함하여 /* */라고 적는다.
p { color/* */:white;}
 

Win IE 4~6, Mac IE 4, Netscape 4 제외시키기
셀렉터 앞에 html>body를 붙인다.
html>body p { color:white;}
 

Win IE 6 제외시키기
프로퍼티와 값을 구분하는 콜론(;)의 앞에, 스페이스와 코멘트를 /**/라고 적는다.
p { color /**/:white;}
star hack
셀렉트 앞에 *html를 붙이면, Win IE 4~6, Mac IE 4~5 등에는 스타일이 적용되고, 그 외의 브라우저에서는 적용되지 않는다.
*html p { color:white; }
underscore hack
프로퍼티의 가장 앞부분에 언더스코어(_)를 붙이면, Win IE 4~6에서 스타일이 적용되고, 다른 브라우저에서는 적용되지 않는다.
p { _color:white; }
hash hack
프로퍼티의 앞에 샾(#)을 붙이면, Win IE 4~6, Mac IE 5, Opera 7, Mozilla, Firefox에서는 스타일이 적용되고, 다른 브라우저에는 적용되지 않는다.
p { #color:white; }
star 7 hack
셀렉트의 앞에 html*을 붙이면, Win IE 5.5~6, Mac IE 5, Safari 등에서 스타일이 적용되고, 다른 브라우저에서는 적용되지 않는다. html*과 셀렉터사이에 스페이스를 넣지 않는다.
html*p { color:white; }
xmlns hack
속성셀렉터를 이용하여, html요소에 붙이는 xmlns속성을 스타일적용을 위하여 사용하는 방법.
Mozilla, Fire-fox, Opera 7/8, Safari 등 속성셀렉터를 서포트하는 브라우저에서는 스타일이 적용되고, 다른 브라우저에서는 적용되지 않는다.
html[xmlns] h1 { color:red; }
:root hack
셀렉터의 앞에 :root를 붙이면, Mozilla, Firefox, Mac IE 5, Safari 등 :root유사클래스를 지원하는 브라우저에만 스타일이 적용되고, 다른 브라우저에서는 적용되지 않는다.
:root h1 { color:red; }
Tantek box model hack
voice-family프로퍼티를 이용한 가장 유명한 박스모델핵.
div#content {
width:500px;
voice-family: ""}"";
voice-family:inherit;
width:400px;
}
 

Win IE 5용 패스필터
@media tty {
i{content:"";/*" "*/}}; @import '/css/style.css'; {;}/*";}
}/* */Win IE 5.5용 패스필터
@media tty {
i{content:"";/*" "*/}}@m; @import '/css/style.css';/*";}
}/* */Win IE 5-5.5용 패스필터
@media tty {
i{content:"";/*" "*/}}@import '/css/style.css';/*";}
}/* */모던브라우저용 패스필터
@import "null?"{";
@import "/css/style.css";
@import "null?"}";이 이외에도 많은 핵(hack)이 존재한다. CSS Filters (dithered.com)에 다양한 CSS hack이 잘 정리되어 있으므로 참고하시길…
2006년 7월 18일, IE7용의 핵(hack)을 추가.
IE7에만 적용
IE7에만 다른 스타일을 적용하는 방법은 해당 셀렉터의 앞에
*+html body이나(*+html body는 Opera8~에도 적용되어 버리는 문제가 있기에 *+html>/**/body로 Opera8~ 전용 스타일을 기술하여야 한다. 참조:IE7のCSSバグとOpera CSS Hack)
*:first-child+html을 기술한 다음 해당 셀렉터와 스타일을 작성하면 된다. 예를 들어 #banner라는 id셀렉터에 적용시키는 경우
*:first-child+html #banner {
      :
  [IE7용 스타일을 기술]
      :
}라고 기술한다. IE7이외의 브라우저를 위한 원래의 #banner 스타일 설정은 IE7용 스타일 설정 앞에 기술한다(순서가 바뀌면 원하는 효과를 얻지 못한다. 참조:IE7 の CSS ハック)
#banner {
      :
  [IE7이외의 브라우저를 위한 스타일을 기술]
      :
}
*:first-child+html #banner {
      :
  [IE7용 스타일을 기술]
      :
}IE 6 and below (IE6이하)
* htmlIE 7 and below (IE7이하)
*:first-child+html, * htmlIE 7 only (IE7전용)
*:first-child+htmlIE 7 and modern browsers only (IE7과 모던브라우저)
html>bodyModern browsers only (not IE 7) (IE7이외의 모던 브라우저)
html>/**/bodyRecent Opera versions 9 and below (최근의 Opera9이하)
html:first-childSafari에만 적용
/* XXX */로 코멘트 아웃하고 html:66irst-child를 덧붙임으로써 Safari에만 CSS가 적용된다.
/* safari only */
html:66irst-child div.globalContainer{
margin: 0 0 0 18px;
}
/* end */


출처 : http://www.nmindplus.com
AND

State Management

WEB/ASP.NET 2007. 1. 24. 17:41
상태 저장법

[Client]
Hidden Field/memory
쿠키/memory&file
View State/ASP.NET/memory
연결문자열/aspx?id=...
[Server]
Application/memory
Session/memory
Profile/ASP.NET/DB 이용/MSSQL종속

저장위치종류RamFile공유범위특징
Client
Hidden Field
O




Cookie
OO


View State
O*

Round Trip을 위해 hidden field를 사용

쿼리 문자열




Server
Application State
O
해당 어플리케이션내


Session
O
해당 클라이언트만

AND