PHP 함수 sprintf()에 대해 자세히 알아 보려고하는데 php.net이 여전히 혼란스러워서 많은 도움이되지 않았습니다.
아래 예제를 살펴보세요.
이것을 사용하는 이유:
$output = sprintf("Here is the result: %s for this date %s", $result, $date);
이렇게 하면 동일한 기능을 수행하며 IMO를 작성하기가 더 쉽습니다:
$output = 'Here is the result: ' .$result. ' for this date ' .$date;
제가 뭔가 놓친 게 있나요?
제가 한 가지 방법은 여러 가지가 있지만 그 사용 용도 스프링스프 () 는 다음과 같은 문자열으로 저장하여 # 39, & # 39, Hello, My Name is %s& php 에서 상수 또는 단일 데이터베이스에서 구분된다. 내가 이렇게 이쪽요 내가 원할 때 사용할 수 있는 문자열 쉽게 할 수 있습니다.
$name = 'Josh';
// $stringFromDB = 'Hello, My Name is %s';
$greeting = sprintf($stringFromDB, $name);
// $greetting = 'Hello, My Name is Josh'
기본적으로 분판 코드의 일부 있습니다. # 39, & # 39 를 사용하고 있는 안녕, 내 이름은 %s&. & # 39, 내가 할 수 있는 여러 곳에 내 코드 변경하십시오 %s 는 내 name& # 39. 한 곳에 또 다른 자동적 업데이트뿐 어디든 갈 필요없이 각 인스턴스에는 및 이동 연결.
스프링스프 관찰지역 애플리케이션을 사용할 수 있다 '는' 다른 '해야' t # 39, 스프링스프 인수만 don& 나타나는 순서대로 형식 문자열.
예:
$color = 'blue';
$item = 'pen';
sprintf('I have a %s %s', $color, $item);
그러나 프랑스 오더합니까 다르게 언어 같은 것이다.
$color = 'bleu';
$item = 'stylo';
sprintf('J\'ai un %2$s %1$s', $color, $item);
(그래, 나의 랑스어 그것은됐다: 학교에서 독일어를 배웠다!)
실제로 you&; d gettext # 39 를 사용하여 저장하였습니다 관찰지역 문장열 확장하지만 내려받습니다 발상이다.
echo _('Here is the result: ') . $result . _(' for this date ') . $date;
번역 (gettext) 문장열 이제.
그 결과 불가능할 수도 있지만 다른 언어로 변환할 때 일부 또는 매우 이상한 마디였나.
이제 경우
echo sprintf(_("Here is the result: %s for this date %s"), $result, $date);
이제 문장열 번역 (gettext):
보유하고 있는 것이 가장 좋은 이유를 찾을 수 있는 사람은 모든 언어 문장열 배치할 수 있습니다 한국어로 번역 및 파일 pokemonsilver. 떠났으리라고 필요에 따라 없음을 알고 있다 - - 그래도 아직 어떤 일이 있어도 포맷하십시오 문자열이어야 프로파일링하려는 표시하십시오 사용자 이름.
예를 들어, 사이트에서 " 생성되었으므로 " 것, 다시 시작합니다. 페이지의 맨 위에 있는. 얼마나 잘 모르는 net/ 또는 # 39 를 프로그래머용 너회가 don&, 방금 사실을 사용자의 이름을 쓸 수 있는 UI 를 보세요들 것인가 - 어디선가 표시됩니까 메시지가 될 것입니다.
그래서 할 수 없이 코드를 포함할 수 있는 메시지를 실제로 의심하였더라 걱정하는데 메시지 기능을 추가할 수 있습니다.
랑 파일 (EN_US):
...
$lang['welcome_message'] = 'Welcome back %s';
...
그러면 모든 종류의 메시지를 사용하여 지원할 수 있는 모든 언어에서 이 실제 php 코드.
sprintf($lang['welcome_message'], $user->name())
>. 왜 투석실에다가 사용할 수 있어?
매우 유용한 입증한 소스임을 써줬지 언어를 사용할 경우 (외부) 필요할 경우 고정식입니다 여러 변수가 지정된 다국어 문자열을 올바른 오더할 알게 됩니다.
not_found = "%s could not be found."
bad_argument = "Bad arguments for function %s."
bad_arg_no = "Bad argument %d for function %s."
not_found = "A keresett eljárás (%s) nem található."
bad_argument = "Érvénytelen paraméterek a(z) %s eljárás hívásakor."
bad_arg_no = "Érvénytelen %d. paraméter a(z) %s eljárás hívásakor."
물론, 심지어 일부 의심할 여지 없이 이 복귀시킴 고유한 함수를 작성할 수 있습니다 수행할 수 있지만, 그냥 훨씬 빠릅니다 을 경미함 성능 향상 (you have a 클래스 '언어' 를 읽을 때 언어 문장열) :
/**
* throws exception with message($name = "ExampleMethod"):
* - using en.txt: ExampleMethod could not be found.
* - using hu.txt: A keresett eljárás (ExampleMethod) nem található.
*/
throw new Exception(sprintf(Language::Get('not_found'), $name));
/**
* throws exception with message ($param_index = 3, $name = "ExampleMethod"):
* - using en.txt: Bad argument 3 for function ExampleMethod.
* - using hu.txt: Érvénytelen 3. paraméter a(z) ExampleMethod eljárás hívásakor.
*/
throw new Exception(sprintf(Language::Get('bad_arg_no'), $param_index, $name));
또한 ',' 의 모든 기능을 함께 갖추고 있어 다양한 유형의 com/go/4e6b330a_kr printf 도 서식 한 줄 광고문, 예를 들면 다음과 같습니다.
앞서 언급했듯이 입력 데이터 형식을 있습니다. 예를 들어, 이로 인해 2dp, 4 자리 숫자, etc. # 39 의 구축을 위한 매우 유익한 it& MySQL 쿼리 문자열.
수 있다는 것이 또 다른 장점은 분리하십시오 레이아웃을 구체화하십시오 데이터에서 급지되는지 it 에 있는, 거의 같은 매개 변수 "라고 하였다. 예를 들어, MySQL 의 경우 쿼리하지:
// For security, you MUST sanitise ALL user input first, eg:
$username = mysql_real_escape_string($_POST['username']); // etc.
// Now creating the query:
$query = sprintf("INSERT INTO `Users` SET `user`='%s',`password`='%s',`realname`='%s';", $username, $passwd_hash, $realname);
이 방법은 물론 다른 용도로 %s/dbase/ext_table. 높여줍니까 인쇄할 때 같은 HTML 로 출력입니다, etc.
편집: 살균, 보안상의 이유로 사용할 때 위와 같은 기술은 입력 변수 () '와' mysql_real_escape_string 합니다 모든 것을 막기 위해 이 방법을 사용하기 전에 MySQL 삽입에서 말했습니다. 분석할 경우 사이트를 해킹해 웅산티스트 입력 및 서버 받게 된다. (제외한 물론 com/go/4e6b330a_kr 완전히 금고에도요 보장받을 수 있으며, 그동안 코드에 의해 구성)
스프링스프 () 사용하여 보다 깔끔할거야 및 안전한 포맷하십시오 너회의 구체화하십시오.
예를 들어, 입력 변수, 예상치 못한 깜짝 놀랄 만한 것을 다루는 you& # 39 쪽의 지정하여 사전에 걱정했던것 형식 (예를 들어, 그 you& # 39, re 검색되어야 문자열 ['%s'] 또는 번호 ['%d.']). 이 유용 가능한 수 있는 위험을 방지할 수 있지만, 2, [SQL 인젝션] # 39 로 문자열이어야 won& 경우 t 로 축약된다.
또한 emailxtender 다루는 자리 precisiontm 유동합니다, 명시적으로 지정할 수 있습니다 (예를 들어 '%.2f') 를 사용한 절약해줍니다 변환 기능 등을 갖추고 있다.
다른 것은 대부분의 주요 프로그래밍 언어를 장이점이 나름의 구현, 스프링스프 () ',' 그래서 한 번 잘 확보하십시오 it& # 39 의 더욱 더 쉽게 사용, 교육이 아닌 새로운 언어 (마치 어떻게 연결할 문자열 변환 또는 유동합니다).
요약하자면, it& # 39 의 좋은 람세를 투명지에 클리너 등을 위해 사용할 수 있는 증상이다.
예를 들어, 아래의 지켜보리니 실제 사례:
$insert .= "('".$tr[0]."','".$tr[0]."','".$tr[0]."','".$tr[0]."'),";
예를 들어 '1& # 39, & # 39, 또는 몇 가지 간단한 예를 인쇄하는 # 39, & # 39, & # 39, & # 39,, 2& 3& # 39, 4& # 39,':
print "foo: '" . $a . "','" . $b . "'; bar: '" . $c . "','" . $d . "'" . "\n";
및 인쇄 및 포맷되었는지 구체화하십시오:
printf("foo: '%d','%d'; bar: '%d','%d'\n", $a, $b, $c, $d);
여기서 '와' printf () '가 있지만, 스프링스프 () 는 문자열 출력 포맷되었을 반환하는 대신' it (변수에 대한).
이는 더 잘?
이:
"<p>Some big paragraph ".$a["name"]." again have to take care of space and stuff .". $a["age"]. "also would be hard to keep track of punctuations and stuff in a really ".$a["token"]. paragraph.";
쓸 수도 있다.
"<p>Some big paragraph {$a['name']} again have to take care of space and stuff .{$a['age']} also would be hard to keep track of punctuations and stuff in a really {$a['token']} paragraph.";
제 생각에는 내가 읽을 수 있지만, 이것은 지역화하기를 또는 포맷을 사용할 더 알 수 있다.
심지어 나는 내가 표시되어도 사용할 경우 이 같은 것을 하고 있다. 사용자에 따라 투입물 이 문서를 생성할 때 도움이 될 것이다.
"<p>Some big paragraph ".$a["name"]." again have tot ake care of space and stuff .". $a["age"]. "also would be hard to keep track of punctuations and stuff in a really ".$a["token"]. paragarapoh.";
쉽게 쓸 수 있는 것처럼
sprintf("Some big paragraph %s. Again have to take care of space and stuff.%s also wouldnt be hard to keep track of punctuations and stuff in a really %s paragraph",$a,$b,$c);
뭐, 우리가 잘 알고 있다 '는' 스프링스프 여러 기능 예를 들어, 다음과 같이.
몇 달 전에 난 롬폭 초 시 분 초 형식으로 변환하는 합니다. 내가 원한 건 'like' like '/ / $ t = h 14 초 494050 인쇄하려면 137 m 10 초' 그래서 '그냥' () 는 php 함수은 지었지 봄의프 초로 잡고 '$ t' 와 '에코 스프링스프 (", %02d h %s% 02d m %s% 02d s", 바닥 ($ t/3600), $ $ $60, f, f, ($ t/60) % t% 60) me', 'h' s 10 m 보기입니다 137 14
we know how to use it 스프링스프 () 함수를 한 경우 상당히 유용합니다.
난 보통 스프링스프 사용하여 사용자로부터 확인하기 위해 제공되는 id 입력 은 정수 (예:
// is better use prepared statements, but this is practical sometimes
$query = sprintf("SELECT * from articles where id = %d;",$_GET['article_id']);
또한 사용할 수 있도록 해야 할 기본적인 템플릿일 (html 메일 또는 기타 창조하셨노), a 템플릿에는 재사용합니다 여러 곳에:
$mail_body = "Hello %s, ...";
$oneMail = sprintf($mail_body, "Victor");
$anotherMail = sprintf($mail_body, "Juan");
출력 형식을 보다 정밀하게 제어해야 하는 경우가 대표적인 예입니다. 예를 들어 특정 값의 길이에 따라 앞쪽에 특정 공백을 추가하거나 숫자를 특정 정확한 형식으로 출력하는 것은 까다로울 수 있습니다.
PHP 매뉴얼에 많은 예제가 있습니다1.
또한 '작성하기 쉬운' 예제에 대해서도 설명합니다. 에코가 작성하기 더 쉬울 수 있지만, 특히 변수가 많은 경우 스프린트프가 더 읽기 쉽습니다.
sprintf 또는 printf를 사용하는 또 다른 이유는 사용자가 특정 값의 출력 형식을 정의하도록 허용하고 싶기 때문일 수 있는데, 이 경우 사용자가 sprintf 호환 출력 형식을 정의하도록 허용할 수 있습니다.
아, 그리고 귀하의 예제는 실제로 한 부분에서 잘못되었습니다. 'sprintf'는 문자열을 반환하지만 '에코'는 그렇지 않습니다. '에코'는 문자열을 즉시 출력하고 아무것도 반환하지 않는 반면, 'sprintf'는 문자열을 반환하기만 합니다.
특히 유용합니다 문장열 스프링스프 포맷할 때 사용하는 숫자. 예를 들어,
$oranges = -2.34;
echo sprintf("There are %d oranges in the basket", $oranges);
Output: There are -2 oranges in the basket
오렌지 (-2) 으로 포맷되었습니다 할 뿐, 양의 정수 숫자를 사용하는 서명되지 않은 경우) 의 값이 줄 바꿈될 %u. 이를 방지하기 위해 사용할 수 있다, 나는 절대 기능, 자산담보부증권 (abs) 을 향해 라운드하지 제로 다음과 같습니다.
$oranges = -5.67;
echo sprintf("There are %d oranges in the basket", abs($oranges));
Output: There are 5 oranges in the basket
결과적으로 높은 가독성을 높이기 위해 공사를 통해, 논리, 그리고 선택해제합니다 서식 및 유연도를 필요에 따라 추가 변수. 와 함께 여러 변수가 될 수 있는 기능을 조작할 캐시-코어 이러한 변수를 좀 더 분명하다. 이에 따라 최종 예:
$oranges = -3.14;
$apples = 1.5;
echo sprintf("There are %d oranges and %d apples", abs($oranges), abs($apples));
Output: There are 3 oranges and 4 apples
왼쪽에 있는 동안, 이 경우는 가지유형의 걱정했던것 값뿐만 스프링스프 기술서임을 확실히요 문자열 변수를 조작 방식을 오른쪽면 뜻을 명확히 사용되고 있다.
스프링스프 () 함수를 사용하여 일반 연결을 통해 이미 수 있는 다양한 유형의 서식 적용하십시오 com/go/4e6b330a_kr 연결된 수 있다는 이점이 있습니다.
이 경우
$output = sprintf("Here is the result: %s for this date %s", $result, $date);
및
$output = 'Here is the result: ' .$result. ' for this date ' .$date;
일반 내려받습니다 출력입니다 연결을 통해 사용할 수 있습니다.
Here is the result: passed for this date 23rd
그러나 사용할 경우 다음과 같은 수정되었음 출력입니다 얻을 수 있으며, 스프링스프 () ''
$output = sprintf('Here is the result: %.4s for this date %.2s',$result,$date);
echo $output;
출력:
Here is the result: pass for this date 23