2014-09-24 1 views
0
$message = "[Link] Thanks [Link]"; 
echo str_replace(
array("[Link]", "[Link]"), 
array("mylink1", "mylink2"), 
$message 
); 

프린트와 단일 문자열 바꾸기 : "mylink1 감사 mylink1"여러 문자열

, 나는 인쇄 할 "mylink1 감사 mylink2"

그렇게 할 수있는 적절한 방법은 무엇입니까?

답변

3

코드에서이 기능을 드롭 인 대체품으로 사용할 수 있습니다. @ 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 
); 
+0

와우. 여기 정규 표현식 그룹에 대해 생각해 보았습니다. 잘 했어. – MoshMage

+0

이것은 깔끔한 해결책이지만 메시지에서'%'를 이스케이프하기 위해 여분의'str_replace ('%', '%%', $ subject)'를 추가해야합니다. – Gellweiler

+0

그리고 외부에서 오는 경우 대체물에서'%'를 '%%'로 대체해야합니다. – Gellweiler

3

아마도 sprintf을 검색하고 있습니까?

$message = "%s Thanks %s"; 
echo sprintf($message, "mylink1", "mylink2"); // mylink1 Thanks mylink2 

DEMO


당신이 (동적 변수에 유용) 배열을 사용하는 것을 선호하는 경우는, vsprintf있다 :

$message = "%s Thanks %s"; 
echo vsprintf($message, array("mylink1", "mylink2")); // mylink1 Thanks mylink2 

DEMO


이 실제로 인 경우 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 

DEMO

+0

[내 답변] (http://stackoverflow.com/a/26014204/511529)을 수정하여 귀하의 답변을 사용합니다. – GolezTrol

0

당신은 제한

$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

+0

단지 부수적 인 말로서, 대부분의 경우에 잘 작동하지만, 대체물에'[Link]'가 있으면 문제가 될 것입니다. 일반적으로 일반적인 문제는 아니지만 일부 특수 시나리오에서는 문제가 될 수 있습니다. – Gellweiler

+0

예를 들면 다음과 같습니다. 온라인 편집기에서 이것을 사용하여 사용자가 메시지에 링크를 추가 할 수있게하십시오. 링크가'XSS'를 포함하지 않는지 확인하기 위해 필터를 실행합니다 (플랫폼이 페이로드의 런치 패드가되지 않도록). 이제 공격자는 페이로드 URL에서'[Link]'를 사용하여 다중 링크로 페이로드를 분할하고 그런 식으로 필터를 속일 수 있습니다. 이 시나리오는 약간 구성 될 수 있지만 처음부터 잠재적 인 필터 문제를 방지하는 것이 항상 영리하다고 생각합니다. – Gellweiler

0

쉬운 방법은 str_replacevsprintf을 결합하는 것입니다.

$message = "[Link] Thanks [Link]"; 
$template = str_replace("[Link]", "%s", $message); 
echo vsprintf($template, array("mylink1", "mylink2")); 
0

당신이 당신의 메시지 %을 가질 수 있다면 vsprintf는 해가 될 수있는 사용이

$message = "[Link] Thanks [Link]"; 
echo preg_replace(array("/\[Link\]/", "/\[Link\]/"), 
array("mylink1", "mylink2"), 
$message, 1); 
+0

나는 OP와 다른 방문자들에게 당신의 의도에 대한 설명을 추가 할 때 더 많은 도움이 될 것이라고 생각합니다. – reporter

0

보십시오. [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'));