$message = "[Link] Thanks [Link]";
echo str_replace(
array("[Link]", "[Link]"),
array("mylink1", "mylink2"),
$message
);
프린트와 단일 문자열 바꾸기 : "mylink1 감사 mylink1"여러 문자열
, 나는 인쇄 할 "mylink1 감사 mylink2"
그렇게 할 수있는 적절한 방법은 무엇입니까?
$message = "[Link] Thanks [Link]";
echo str_replace(
array("[Link]", "[Link]"),
array("mylink1", "mylink2"),
$message
);
프린트와 단일 문자열 바꾸기 : "mylink1 감사 mylink1"여러 문자열
, 나는 인쇄 할 "mylink1 감사 mylink2"
그렇게 할 수있는 적절한 방법은 무엇입니까?
코드에서이 기능을 드롭 인 대체품으로 사용할 수 있습니다. @ h2ooooooo가 시연 된대로 vsprintf
을 사용합니다. 내가 이전 버전을 사용하지 못했습니다. 왜냐하면 $count
매개 변수를 str_replace
으로 잘못 사용했기 때문입니다.
function str_replace_array($search, array $replace, $subject)
{
return vsprintf(
str_replace('[Link]', '%s', $subject),
$replace);
}
$message = "[Link] Thanks [Link]";
echo str_replace_array(
"[Link]",
array("mylink1", "mylink2"),
$message
);
아마도 sprintf
을 검색하고 있습니까?
$message = "%s Thanks %s";
echo sprintf($message, "mylink1", "mylink2"); // mylink1 Thanks mylink2
당신이 (동적 변수에 유용) 배열을 사용하는 것을 선호하는 경우는, vsprintf
있다 :
$message = "%s Thanks %s";
echo vsprintf($message, array("mylink1", "mylink2")); // mylink1 Thanks mylink2
이 실제로 인 경우 sprintf
또는 vsprintf
을 사용하지 않으려면 preg_replace
을 사용하고 4 번째 매개 변수 (limit
)는 "1"입니다 (검색된 첫 번째 일치에만이 작업을 수행하십시오).
<?php
function smartReplace($search, $replace, $subject) {
if (!is_array($search)) {
throw new Exception('$search must be an array');
}
if (!is_array($replace)) {
throw new Exception('$replace must be an array');
}
if (!is_string($subject)) {
throw new Exception('$subject must be a string');
}
for ($i = 0, $len = count($search); $i < $len; $i++) {
$subject = preg_replace('/' . preg_quote($search[$i], '/') . '/', $replace[$i], $subject, 1);
}
return $subject;
}
$message = "[Link] Thanks [Link]";
echo smartReplace(
array("[Link]", "[Link]"),
array("mylink1", "mylink2"),
$message
); // mylink1 Thanks mylink2
[내 답변] (http://stackoverflow.com/a/26014204/511529)을 수정하여 귀하의 답변을 사용합니다. – GolezTrol
당신은 제한
$message = "[Link] Thanks [Link]";
$replacements = array ("Link 1", "Link 2");
while (!empty($replacements)) {
$replacement = array_shift($replacements);
$message = preg_replace("/\[Link\]/", $replacement, $message, 1);
}
echo $message;
을 설정하는 preg_replace
대신 str_replace
을 사용할 수 있습니다 : 당신이 preg_quote
그래서 .
, +
, *
등을 함께 확인 사용 확인하는 것은 특별한 의미가 없습니다 출력 :
링크 1 개 감사합니다 링크 2
단지 부수적 인 말로서, 대부분의 경우에 잘 작동하지만, 대체물에'[Link]'가 있으면 문제가 될 것입니다. 일반적으로 일반적인 문제는 아니지만 일부 특수 시나리오에서는 문제가 될 수 있습니다. – Gellweiler
예를 들면 다음과 같습니다. 온라인 편집기에서 이것을 사용하여 사용자가 메시지에 링크를 추가 할 수있게하십시오. 링크가'XSS'를 포함하지 않는지 확인하기 위해 필터를 실행합니다 (플랫폼이 페이로드의 런치 패드가되지 않도록). 이제 공격자는 페이로드 URL에서'[Link]'를 사용하여 다중 링크로 페이로드를 분할하고 그런 식으로 필터를 속일 수 있습니다. 이 시나리오는 약간 구성 될 수 있지만 처음부터 잠재적 인 필터 문제를 방지하는 것이 항상 영리하다고 생각합니다. – Gellweiler
쉬운 방법은 str_replace
및 vsprintf
을 결합하는 것입니다.
$message = "[Link] Thanks [Link]";
$template = str_replace("[Link]", "%s", $message);
echo vsprintf($template, array("mylink1", "mylink2"));
당신이 당신의 메시지 %
을 가질 수 있다면 vsprintf는 해가 될 수있는 사용이
$message = "[Link] Thanks [Link]";
echo preg_replace(array("/\[Link\]/", "/\[Link\]/"),
array("mylink1", "mylink2"),
$message, 1);
나는 OP와 다른 방문자들에게 당신의 의도에 대한 설명을 추가 할 때 더 많은 도움이 될 것이라고 생각합니다. – reporter
보십시오. [Link]
을 %s
으로 바꾸기 전에 의 모든 항목을 %%
으로 바꾼 다음 vsprintf를 호출 할 수 있습니다. 하지만 간단한 배열 함수 만 사용하면 문자를 제대로 이스케이프 처리하는 것에 대해 걱정할 필요가 없습니다.
function str_replace_array($message, $search, $replacements)
{
$result = '';
$pieces = explode($search, $message);
$replace = reset($replacements);
foreach ($pieces as $i => $piece) {
if ($replace === FALSE) {
throw new Exception('There are not enough replacements for all occurences of the search string.');
}
if ($i !== 0) {
$result .= $replace;
$replace = next($replacements);
}
$result .= $piece;
}
return $result;
}
echo str_replace_array('[Link] Thanks [Link]', '[Link]', array('mylink1', 'mylink2'));
와우. 여기 정규 표현식 그룹에 대해 생각해 보았습니다. 잘 했어. – MoshMage
이것은 깔끔한 해결책이지만 메시지에서'%'를 이스케이프하기 위해 여분의'str_replace ('%', '%%', $ subject)'를 추가해야합니다. – Gellweiler
그리고 외부에서 오는 경우 대체물에서'%'를 '%%'로 대체해야합니다. – Gellweiler