2012-01-14 14 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はいないようですので、

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

さらに私がするpreg_matchのようなすべてのマッチの配列を取得したいと思いますが行っているだろうが、私はすることができませんその配列を提供する。これを達成する最も効率的な方法は何ですか?私は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

@Leoはい、PHP 5.3を使用している場合は、間違いなく他の答えと同じように匿名関数を使用します。あなたが5.3を持っているかどうか分からなかったので、私はこのバージョンを投稿しました。 – Esailija

+0

ありがとうございました。 – DavidW

2

と現代5.3の構文を利用しpreg_replace_callbackの他の変形例:

$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;"を使う必要がないので、このverionがより有利でしょうか? ? – DavidW

+0

確かに、 'global'を使うのはかなり古いスタイルです。 PHP 5.3は、新しい機能を提供します。グローバルの使用は別の方法ですが。あなたはあなたのために何が適切かを決める。 – dfsq

+0

ありがとうございました。 – DavidW

関連する問題