2012-01-14 3 views
0

@ 기호가 앞에 붙은 사용자 이름이 포함 된 텍스트가 있습니다. 예 : 나는 예를 위해, 링크가 사용자 이름의 모든 차례 나오는 대체 할preg_replace를 사용하고 일치 항목을 얻는 방법은 무엇입니까?

One day @john decided to ask @jane out. 

, 나는 링크 사용자와 @user을 대체 할 것이라고 말 예 수 있습니다 :

One day link-john decided to ask link-jane out. 

이는 다음 명령을 수행 할 수 있습니다

또한
preg_replace('`@([a-zA-Z0-9]{2,15})`', 'link-$1', $text); 

내가했을 preg_match를 같은 모든 경기의 배열을 취득하고 싶지만, preg_replace이다가 보이지 않기 때문에 내가 드릴 수 없습니다 해당 배열을 제공합니다. 이것을 달성하는 가장 효율적인 방법은 무엇입니까? preg_match를하고 나중에 preg_replace가 자원 낭비가 될 것 같은 느낌이 들지 않습니까?

더 좋은 방법이 있다고 생각하시는 분은 보내 주신 의견을 보내 주시면 감사하겠습니다.

감사합니다.

+0

아니, 더 나은 옵션이 없습니다. 'preg_replace_callback'을 사용하여 콜백에서 일치 항목을 대체하고 어셈블 할 수 있습니다. 그러나 그것은 실제로 "더 나은"자격을 얻지 못합니다. - 자원에 관해서는 항상 * after * 프로파일 링을 최적화하십시오. – mario

답변

2

당신은 preg_replace_callback를 사용할 수 있습니다

<pre> 
<?php 

$arr = array(); 

function linker($matches) { 
    global $arr; 
    $arr[] = $matches[1]; 
    return "link-{$matches[1]}"; 
} 

$text = "One day @john decided to ask @jane out."; 
$result = preg_replace_callback('`@([a-zA-Z0-9]{2,15})`', "linker", $text); 

echo $result . "\n";  
print_r($arr); 
?> 
</pre> 

결과 : 당신이 PHP 5.3을 사용하는 경우

One day link-john decided to ask link-jane out. 
Array 
(
    [0] => john 
    [1] => jane 
) 

, 당신은 익명의 기능이 훨씬 청소기 만들 수 있습니다.

+0

클리너를 사용하면 전역 $ arr을 사용할 필요가 없다는 의미입니다. ? – DavidW

+0

@ 예 예 PHP 5.3을 사용하고 있다면 다른 답변과 마찬가지로 익명의 함수를 사용하십시오. 5.3 버전을 가지고 있는지 확신 할 수 없어서이 버전을 게시했습니다. – Esailija

+0

고맙습니다. – DavidW

2

그리고 preg_replace_callback의 또 다른 변형 현대 5.3 구문을 사용 :

$str = "One day @john decided to ask @jane out."; 

$matches = array(); 
$str = preg_replace_callback('`@([a-zA-Z0-9]{2,15})`', function($m) use(&$matches) { 
    $matches[] = $m; 
    return $m[1] . '-link'; 
}, $str); 

echo '<pre>'; print_r($matches); echo '</pre>'; 

출력 :

Array 
(
    [0] => Array 
     (
      [0] => @john 
      [1] => john 
     ) 

    [1] => Array 
     (
      [0] => @jane 
      [1] => jane 
     ) 

) 
+0

글로벌 선언 "global $ arr;"을 사용할 필요가 없으므로이 버전이 더 유리한가요? ? – DavidW

+0

물론,'global'을 사용하는 것은 꽤 오래된 학교 스타일입니다. PHP 5.3은 우리에게 새로운 기회를 제공합니다. 글로벌 사용은 다른 방법이지만. 당신은 당신에게 적합한 것을 결정합니다. – dfsq

+0

대단히 감사합니다. – DavidW

관련 문제