>웹 프론트엔드 >JS 튜토리얼 >js 정규식의 기본 구문 요약

js 정규식의 기본 구문 요약

零到壹度
零到壹度원래의
2018-03-28 14:46:211922검색

이 글은 주로 js 정규식의 기본 구문 요약을 공유하며 좋은 참고 가치가 있으며 모든 사람에게 도움이 되기를 바랍니다. 편집자를 따라가서 살펴보겠습니다.

1. 기본 정규식 구문

두 개의 특수 기호 '^' 및 '$'. 그들의 기능은 각각 문자열의 시작과 끝을 나타내는 것입니다.

예는 다음과 같습니다:

"^The": "The"로 시작하는 모든 문자열을 의미합니다("There", "The cat" 등).

"of 절망$": "로 끝나는 모든 문자열을 의미합니다. of 절망" 문자열;

"^abc$": "abc"로 시작하고 끝나는 문자열을 나타냅니다. 하하, "abc" 자체만 나타냅니다.

"notice": "notice"를 포함하는 문자열을 나타냅니다.

마지막 예와 같이 두 개의 특수 문자를 사용하지 않으면 찾으려는 문자열이 검색된 문자열의 어떤 부분에도 있음을 나타내는 것입니다. 즉, 맨 위에 위치하는 것이 아닙니다.

기타 기호로는 '*', '+', '?' 등이 있는데, 이는 문자 또는 일련의 문자가 반복적으로 나타나는 횟수를 나타냅니다.

각각 "없음 또는 그 이상", "한 번 이상" 및 "없음 또는 한 번"을 의미합니다.


다음은 몇 가지 예입니다.

"ab*": 문자열에 a 다음에 0개 또는 여러 개의 b가 있음을 나타냅니다. ("a", "ab", "abbb",...);

"ab+": 문자열에 a가 하나 이상 있음을 나타냅니다.

"ab?": 문자열을 나타냅니다. a 다음에 0개 또는 1개의 b가 있습니다.

"a?b+$": 문자열 끝에 a가 0개 또는 1개 있고 b가 1개 또는 여러 개 있다는 의미입니다.

중괄호로 묶인 범위를 사용하여 반복 범위를 나타낼 수도 있습니다.

"ab{2}": 문자열에 a 뒤에 2개의 b가 있음을 나타냅니다("abb").

"ab{2,}": 문자열에 a 뒤에 최소한 2개의 b가 있음을 나타냅니다.

"ab{3,5}": 문자열에 a 다음에 3~5b가 있음을 나타냅니다.

범위의 하한을 지정해야 한다는 점에 유의하세요(예: "{,2}" 대신 "{0,2}").

또한 '*', '+' 및 '?'는 "{0,}", "{1,}" 및 "{0,1}"과 동일하다는 점을 눈치채셨을 것입니다.

"또는" 연산을 의미하는 '¦'도 있습니다.

"hi¦hello": 문자열에 "hi" 또는 "hello"가 있음을 의미합니다.

"(b¦cd)ef": "bef" 또는 "cdef"를 의미합니다.

"(a¦b)*c": "a"와 "b" 뒤에 "c"가 오는 혼합 문자열을 나타냅니다.'

"a.[0-9]": 문자열에 "a" 뒤에 임의의 문자와 숫자가 있음을 나타냅니다.

"^.{3}$": 세 문자로 구성된 문자열을 나타냅니다. 길이는 3자입니다.)

대괄호는 특정 문자가 문자열의 특정 위치에 나타날 수 있음을 나타냅니다.

"[ab]": 문자열에 "a" 또는 "b"가 있음을 나타냅니다. to "a¦b");

"[a-d]": 문자열에 소문자 'a' ~ 'd' 중 하나가 포함되어 있음을 나타냅니다("a¦b¦c¦d" 또는 "[abcd ]"와 동일). ;

"^[a-zA-Z]": 문자로 시작하는 문자열을 나타냅니다.

"[0-9]%": 백분율 기호 앞에 있는 숫자를 나타냅니다.

",[a-zA-Z0-9]$": 문자열이 쉼표로 끝나고 그 뒤에 문자나 숫자가 오는 것을 나타냅니다.

대괄호 안에 '^'를 사용하여 원하지 않는 문자를 나타낼 수도 있습니다. '^'는 대괄호 안의 첫 번째 문자여야 합니다.

(예: "%[^a-zA-Z]%"는 두 개의 퍼센트 기호 사이에 문자가 나타나지 않아야 함을 의미합니다).

그대로 표현하려면 "^.$()¦*+?{" 문자 앞에 시프트 문자 ''를 추가해야 합니다.

대괄호 안에는 이스케이프 문자가 필요하지 않습니다.

2. 텍스트 상자의 입력 문자 유형을 제어합니다

1. 숫자와 영어만 입력할 수 있습니다:

<input onkeyup="value=value.replace(/[\W]/g,&#39;&#39;) "
 onbeforepaste="clipboardData.setData(&#39;text&#39;,clipboardData.getData(&#39;text&#39;).replace(/[^\d]/g,&#39;&#39;))" 
 ID="Text1" 
 NAME="Text1">

2. 숫자만 입력할 수 있습니다:

<input onkeyup="value=value.replace(/[^\d]/g,&#39;&#39;) " 
onbeforepaste="clipboardData.setData(&#39;text&#39;,clipboardData.getData(&#39;text&#39;).replace(/[^\d]/g,&#39;&#39;))" 
ID="Text2" 
NAME="Text2">

3. 전각 문자만 입력 가능:


<input onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,&#39;&#39;)" 
onbeforepaste="clipboardData.setData(&#39;text&#39;,clipboardData.getData(&#39;text&#39;).replace(/[^\uFF00-\uFFFF]/g,&#39;&#39;))" 
ID="Text3" 
NAME="Text3">

4. 한자만 입력 가능:

<input onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,&#39;&#39;)" 
onbeforepaste="clipboardData.setData(&#39;text&#39;,clipboardData.getData(&#39;text&#39;).replace(/[^\u4E00-\u9FA5]/g,&#39;&#39;))" 
ID="Text4" 
NAME="Text4">

3 정규식 적용 예시에 대한 인기 설명

* ***** ********************************************* ****** *************************

//모두 숫자로 구성되어 있는지 확인

/^[0- 9]{1,20}$/

^은 ^

$ 바로 다음의 시작 문자가 규칙과 일치해야 함을 의미합니다. 즉, $

[] 직전의 시작 문자가 규칙과 일치해야 한다는 의미는 선택적 문자 집합입니다

[0-9] 필수 문자 범위가 0-9임을 나타냅니다

{1,20}은 숫자 문자열의 합법적인 길이가 1~20, 즉 [0-9]의 문자 발생 횟수 범위가 1~20번임을 의미합니다.

/^ 및 $/는 문자열의 하위 문자열만 일치시키는 것이 아니라 전체 문자열이 정의된 규칙과 완전히 일치해야 함을 나타내기 위해 쌍으로 사용해야 합니다.

************************************************* ***** *********************************

//로그인 이름 확인: 5-20만 문자를 입력할 수 있습니다. 숫자, "_", "."를 포함할 수 있는 문자열로 시작합니다.

/^[a-zA-Z]{1}([a-zA-Z0-9]|[._] ){4,19 }$/

^[a-zA-Z]{1}는 첫 번째 문자가 문자여야 함을 의미합니다.

([a-zA-Z0-9]|[._]){4,19}는 길이가 4~9자리 문자열인 두 번째 숫자(이전 표현식 바로 뒤에 오기 때문에)부터 시작한다는 의미입니다. 대문자, 소문자, 숫자 또는 특수문자 집합[._]으로 구성되어야 합니다.

************************************************* ***** ************************************

//사용자 이름 확인: 만 1~30자까지 입력 가능

/^[a-zA-Z]{1,30}$/

********************로 시작하는 문자열 ****** ******************************************** ******* *****

//인증비밀번호 : 영문, 숫자, 밑줄 6~20자만 입력 가능

/^(w){6,20}$/

w: 문자, 숫자 또는 밑줄 문자를 일치시키는 데 사용됩니다.

**************************************** ******* *************************************

//확인 일반 전화 및 팩스 번호: "+" 또는 숫자로 시작할 수 있고 "-" 및 "

/^[+]{0,1}(d){1,3}[ ]?( [-]?((d)| [ ]){1,12})+$/

d: 0에서 9까지의 숫자를 일치시키는 데 사용됩니다.

“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次

可以匹配的字符串如:+123 -999 999 ; +123-999 999 ;123 999 999 ;+123 999999等

*******************************************************************************
//校验URL

/^http[s]{0,1}:\/\/.+$/ 或 /^http[s]{0,1}:\/\/.{1,n}$/ (表示url串的长度为length(“https://”) + n )
 \ / :表示字符“/”。

. 表示所有字符的集

+ 等同于{1,},就是1到正无穷吧。

 *******************************************************************************

//校验纯中文字符
/

^[\u4E00-\u9FA5]+$/

[\u4E00-\u9FA5] :估计是中文字符集的范围吧

以上表达式均在下面的javascript中测试通过


<html>
<script language="JavaScript">
<!--
function regx(r,s)
{
    if (r == null || r == ""){
       return false;
    }
    var patrn= new RegExp(r);
    if (patrn.exec(s))
       return true
    return false
}
 
-->
</script>
<body>
<form>

规则表达式 :


 <input type="input" name="regxStr" value="" > (填写/ /之间的表达式)
<br>

校验字符串 :

 <input type="input" name="str" value="" >
    <input type="button" name="match" value="匹配" onClick="alert(regx(regxStr.value,str.value));">
</form>
</body>
</html>

4.正則表達式應用

"^\d+$"  //非负整数(正整数 + 0) 

"^[0-9]*[1-9][0-9]*$"  //正整数 

"^((-\d+)|(0+))$"  //非正整数(负整数 + 0) 

"^-[0-9]*[1-9][0-9]*$" //음의 정수

"^-?d+$" //정수

"^d+(.d+) ?$"  //음수가 아닌 부동 소수점 수(양의 부동 소수점 수 + 0)

"^(([0-9]+.[0-9]*[1-9][0-9]* )|( [0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$ " // 양의 부동 소수점 수

"^((-d+(.d+)?)|(0+(.0+)?))$" //양수가 아닌 부동 소수점 수(음의 부동 소수점 수 + 0)

"^ (-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][ 0-9]*.[ 0-9]+)|([0-9]*[1-9][0-9]*)))$"  // 음의 부동 소수점 수

"^(- ?d+)(.d+)? $" // 부동 소수점 숫자

"^[A-Za-z]+$" // 26개의 영문자로 구성된 문자열

"^[A-Z]+$" // 영문 26자로 구성된 문자열 대문자로 구성된 문자열

"^[a-z]+$" //영문 26자로 구성된 문자열

"^[A-Za-z0-9]+$ " //구성됨 숫자와 영문 26자리로 구성된 문자열

"^w+$" // 숫자와 영문 26자리 또는 밑줄로 구성된 문자열

"^[w-]+(.[w- ]+ )*@[w-]+(.[w-]+)+$"    //이메일 주소

"^[a-zA-z]+://(w+(-w+)*)( .( w+(-w+)*))*(?S*)?$"  //url

/^(d{2}|d{4})-((0([1-9]{1 }) )|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 연월- 일

/^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))| (3 [0|1]))/(d{2}|d{4})$/ // 월/일/년

"^([w-.]+)@(([[0- 9] {1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA- Z] {2,4}|[0-9]{1,3})(]?)$" //Emil

"(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?"     //电话号码

"^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$"   //IP地址

^([0-9A-F]{2})(-[0-9A-F]{2}){5}$   //MAC地址的正则表达式

^[-+]?\d+(\.\d+)?$  //值类型正则表达式

5.javascript正则表达式检验

//校验是否全由数字组成


function isDigit(s)
{
var patrn=/^[0-9]{1,20}$/;
if (!patrn.exec(s)) return false
return true
}

//校验登录名:只能输入5-20个以字母开头、可带数字、“_”、“.”的字串

function isRegisterUserName(s)
{
var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/;
if (!patrn.exec(s)) return false
return true
}

//校验用户姓名:只能输入1-30个以字母开头的字串

function isTrueName(s)
{
var patrn=/^[a-zA-Z]{1,30}$/;
if (!patrn.exec(s)) return false
return true
}

//校验密码:只能输入6-20个字母、数字、下划线

function isPasswd(s)
{
var patrn=/^(\w){6,20}$/;
if (!patrn.exec(s)) return false
return true
}

//校验普通电话、传真号码:可以“+”开头,除数字外,可含有“-”

function isTel(s)
{
//var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?(\d){1,12})+$/;
var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;
if (!patrn.exec(s)) return false
return true
}

//校验手机号码:必须以数字开头,除数字外,可含有“-”

function isMobil(s)
{
var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;
if (!patrn.exec(s)) return false
return true
}

//校验邮政编码

function isPostalCode(s)
{
//var patrn=/^[a-zA-Z0-9]{3,12}$/;
var patrn=/^[a-zA-Z0-9 ]{3,12}$/;
if (!patrn.exec(s)) return false
return true
}

//校验搜索关键字

function isSearch(s)
{
var patrn=/^[^`~!@#$%^&*()+=|\\\][\]\{\}:;\&#39;\,.<>/?]{1}[^`~!@$%^&()+=|\\\][\]\{\}:;\&#39;\,.<>?]{0,19}$/;
if (!patrn.exec(s)) return false
return true
}
function isIP(s) //by zergling
{
var patrn=/^[0-9.]{1,20}$/;
if (!patrn.exec(s)) return false
return true
}
 
/*********************************************************************************
* FUNCTION: isBetween
* PARAMETERS: val AS any value
* lo AS Lower limit to check
* hi AS Higher limit to check
* CALLS: NOTHING
* RETURNS: TRUE if val is between lo and hi both inclusive, otherwise false.
**********************************************************************************/
function isBetween (val, lo, hi) {
if ((val < lo) || (val > hi)) { return(false); }
else { return(true); }
}
/*********************************************************************************
* FUNCTION: isDate checks a valid date
* PARAMETERS: theStr AS String
* CALLS: isBetween, isInt
* RETURNS: TRUE if theStr is a valid date otherwise false.
**********************************************************************************/
function isDate (theStr) {
var the1st = theStr.indexOf(&#39;-&#39;);
var the2nd = theStr.lastIndexOf(&#39;-&#39;);
if (the1st == the2nd) { return(false); }
else {
var y = theStr.substring(0,the1st);
var m = theStr.substring(the1st+1,the2nd);
var d = theStr.substring(the2nd+1,theStr.length);
var maxDays = 31;
if (isInt(m)==false || isInt(d)==false || isInt(y)==false) {
return(false); }
else if (y.length < 4) { return(false); }
else if (!isBetween (m, 1, 12)) { return(false); }
else if (m==4 || m==6 || m==9 || m==11) maxDays = 30;
else if (m==2) {
if (y % 4 > 0) maxDays = 28;
else if (y % 100 == 0 && y % 400 > 0) maxDays = 28;
else maxDays = 29;
}
if (isBetween(d, 1, maxDays) == false) { return(false); }
else { return(true); }
}
}
/*********************************************************************************
* FUNCTION: isEuDate checks a valid date in British format
* PARAMETERS: theStr AS String
* CALLS: isBetween, isInt
* RETURNS: TRUE if theStr is a valid date otherwise false.
**********************************************************************************/
function isEuDate (theStr) {
if (isBetween(theStr.length, 8, 10) == false) { return(false); }
else {
var the1st = theStr.indexOf(&#39;/&#39;);
var the2nd = theStr.lastIndexOf(&#39;/&#39;);
if (the1st == the2nd) { return(false); }
else {
var m = theStr.substring(the1st+1,the2nd);
var d = theStr.substring(0,the1st);
var y = theStr.substring(the2nd+1,theStr.length);
var maxDays = 31;
if (isInt(m)==false || isInt(d)==false || isInt(y)==false) {
return(false); }
else if (y.length < 4) { return(false); }
else if (isBetween (m, 1, 12) == false) { return(false); }
else if (m==4 || m==6 || m==9 || m==11) maxDays = 30;
else if (m==2) {
if (y % 4 > 0) maxDays = 28;
else if (y % 100 == 0 && y % 400 > 0) maxDays = 28;
else maxDays = 29;
}
if (isBetween(d, 1, maxDays) == false) { return(false); }
else { return(true); }
}
}
}
/********************************************************************************
* FUNCTION: Compare Date! Which is the latest!
* PARAMETERS: lessDate,moreDate AS String
* CALLS: isDate,isBetween
* RETURNS: TRUE if lessDate<moreDate
*********************************************************************************/
function isComdate (lessDate , moreDate)
{
if (!isDate(lessDate)) { return(false);}
if (!isDate(moreDate)) { return(false);}
var less1st = lessDate.indexOf(&#39;-&#39;);
var less2nd = lessDate.lastIndexOf(&#39;-&#39;);
var more1st = moreDate.indexOf(&#39;-&#39;);
var more2nd = moreDate.lastIndexOf(&#39;-&#39;);
var lessy = lessDate.substring(0,less1st);
var lessm = lessDate.substring(less1st+1,less2nd);
var lessd = lessDate.substring(less2nd+1,lessDate.length);
var morey = moreDate.substring(0,more1st);
var morem = moreDate.substring(more1st+1,more2nd);
var mored = moreDate.substring(more2nd+1,moreDate.length);
var Date1 = new Date(lessy,lessm,lessd); 
var Date2 = new Date(morey,morem,mored); 
if (Date1>Date2) { return(false);}
return(true);
}
/*********************************************************************************
* FUNCTION isEmpty checks if the parameter is empty or null
* PARAMETER str AS String
**********************************************************************************/
function isEmpty (str) {
if ((str==null)||(str.length==0)) return true;
else return(false);
}
/*********************************************************************************
* FUNCTION: isInt
* PARAMETER: theStr AS String 
* RETURNS: TRUE if the passed parameter is an integer, otherwise FALSE
* CALLS: isDigit
**********************************************************************************/
function isInt (theStr) {
var flag = true;
if (isEmpty(theStr)) { flag=false; }
else
{ for (var i=0; i<theStr.length; i++) {
if (isDigit(theStr.substring(i,i+1)) == false) {
flag = false; break;
}
}
}
return(flag);
}
/*********************************************************************************
* FUNCTION: isReal
* PARAMETER: heStr AS String 
decLen AS Integer (how many digits after period)
* RETURNS: TRUE if theStr is a float, otherwise FALSE
* CALLS: isInt
**********************************************************************************/
function isReal (theStr, decLen) {
var dot1st = theStr.indexOf(&#39;.&#39;);
var dot2nd = theStr.lastIndexOf(&#39;.&#39;);
var OK = true;
if (isEmpty(theStr)) return false;
if (dot1st == -1) {
if (!isInt(theStr)) return(false);
else return(true);
}
else if (dot1st != dot2nd) return (false);
else if (dot1st==0) return (false);
else {
var intPart = theStr.substring(0, dot1st);
var decPart = theStr.substring(dot2nd+1);
if (decPart.length > decLen) return(false);
else if (!isInt(intPart) || !isInt(decPart)) return (false);
else if (isEmpty(decPart)) return (false);
else return(true);
}
}
/*********************************************************************************
* FUNCTION: isEmail
* PARAMETER: String (Email Address)
* RETURNS: TRUE if the String is a valid Email address
* FALSE if the passed string is not a valid Email Address
* EMAIL FORMAT: AnyName@EmailServer e.g; webmaster@hotmail.com
* @ sign can appear only once in the email address.
*********************************************************************************/
function isEmail (theStr) {
var atIndex = theStr.indexOf(&#39;@&#39;);
var dotIndex = theStr.indexOf(&#39;.&#39;, atIndex);
var flag = true;
theSub = theStr.substring(0, dotIndex+1)
if ((atIndex < 1)||(atIndex != theStr.lastIndexOf(&#39;@&#39;))||(dotIndex < atIndex + 2)||(theStr.length <= theSub.length)) 
{ return(false); }
else { return(true); }
}
/*********************************************************************************
* FUNCTION: newWindow
* PARAMETERS: doc -> Document to open in the new window
hite -> Height of the new window
wide -> Width of the new window
bars -> 1-Scroll bars = YES 0-Scroll Bars = NO
resize -> 1-Resizable = YES 0-Resizable = NO
* CALLS: NONE
* RETURNS: New window instance
**********************************************************************************/
function newWindow (doc, hite, wide, bars, resize) {
var winNew="_blank";
var opt="toolbar=0,location=0,directories=0,status=0,menubar=0,";
opt+=("scrollbars="+bars+",");
opt+=("resizable="+resize+",");
opt+=("width="+wide+",");
opt+=("height="+hite);
winHandle=window.open(doc,winNew,opt);
return;
}
/*********************************************************************************
* FUNCTION: DecimalFormat
* PARAMETERS: paramValue -> Field value
* CALLS: NONE
* RETURNS: Formated string
**********************************************************************************/
function DecimalFormat (paramValue) {
var intPart = parseInt(paramValue);
var decPart =parseFloat(paramValue) - intPart;
str = "";
if ((decPart == 0) || (decPart == null)) str += (intPart + ".00");
else str += (intPart + decPart);
return (str);
}

 "^\\d+$"  //非负整数(正整数 + 0) 

"^[0-9]*[1-9][0-9]*$"  //正整数 

"^((-\\d+)|(0+))$"  //非正整数(负整数 + 0) 

"^-[0-9]*[1-9][0-9]*$"  //负整数 

"^-?\d+$"    //정수

"^\d+(\.\d+)?$"   //음수가 아닌 부동 소수점 수(양의 부동 소수점 수 + 0)

"^( ([0 -9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0 -9] +)|([0-9]*[1-9][0-9]*))$" //양수 부동 소수점 수

"^((-\d+(\.\d+) ?)|( 0+(\.0+)?))$" //양수가 아닌 부동 소수점 수(음의 부동 소수점 수 + 0)

"^(-(([0-9]+\. [0-9]*[ 1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0 -9]*[1- 9][0-9]*)))$" //음수 부동 소수점

"^(-?\d+)(\.\d+)?$" //부동 소수점 number

"^[A-Za-z]+$" //영문 26자로 구성된 문자열

"^[A-Z]+$" //영문 대문자 26자로 구성된 문자열

" ^[a-z] +$" // 영문 소문자 26자로 구성된 문자열

"^[A-Za-z0-9]+$" // 숫자와 영문 26자로 구성된 문자열

" ^ \w+$" //숫자, 영문 26자 또는 밑줄로 구성된 문자열

"^[\w-]+(\.[\w-]+)*@[\w-]+( \.[ \w-]+)+$"    //이메일 주소

"^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-- \w+ )*))*(\?\S*)?$"  //url

위는 여러분과 공유하는 정규식의 기본 구문입니다. 모든 분들이 학습하는 데 도움이 되기를 바랍니다.

위 내용은 js 정규식의 기본 구문 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.