如何替换字符串中的自定义“标签”?

时间:2011-01-11 19:48:03

标签: php

鉴于以下内容:

  

$ foo =“哟[用户Cobb]我听说你喜欢梦想,所以我在你的梦中实现梦想,这样你就可以在梦想的同时做梦。”

我想这样做:

  

$ foo = bar($ foo);

     

echo $ foo;

得到这样的东西:

  

Cobb我听说你喜欢梦想,所以我在你的梦中实现梦想,这样你就可以在梦中做梦时做梦。

我不确定bar函数应该如何工作。我认为这对于正则表达式是可行的,但我个人觉得这些很难理解。使用strpos函数是另一种方法,但我想知道是否有更好的解决方案。

伪代码很好,但实际代码将受到赞赏。

编辑:

这些标签不是占位符,因为第二部分是变量值。

编辑:

所有str_replace答案都不正确,因为标签包含可变内容。

5 个答案:

答案 0 :(得分:4)

您可以使用preg_match_all在字符串中搜索标签。

function bar($foo)
{
    $count = preg_match_all("/\[(\w+?)\s(\w+?)\]/", $foo, $matches);
    if($count > 0)
    {
         for($i = 0; $i < $count; $i++)
         {
             // $matches[0][$i] contains the entire matched string
             // $matches[1][$i] contains the first portion (ex: user)
             // $matches[2][$i] contains the second portion (ex: Cobb)

             switch($matches[1][$i])
             {
                 case 'user':
                     $replacement = tag_user($matches[2][$i]);
                     str_replace($matches[0][$i], $replacement, $foo);
                     break;
             }
         }
    }
}

现在,您可以通过向交换机添加更多案例来添加更多功能。

答案 1 :(得分:3)

由于标签包含您要解析的内容而不是静态的替换标签,因此您必须使用正则表达式。 (这是最简单的方法。)

preg_replace()是替换文本的正则表达式函数。

$pattern = '/\[user (\w+)\]/i';
$rpl     = '<a href="http://example.com/user/${1}">${1}</a>';
return preg_replace($pattern, $rpl, $foo);

这将匹配[user xy]标签,其中xy是至少一个字符的单词(单词字符序列)。由于它在括号中,因此可以在替换字符串中使用{1}访问它。 $ foo是您要解析的字符串。返回的是带有替换标记的已解析字符串。模式上的i修饰符将使匹配不区分大小写。如果您希望它区分大小写,请将其删除。


(你从[用户Cobb]解析到wikipedia url leonardo dicabrio的例子,它与userCobb都没有对应。所以无论你到那里,你都必须这样做(查询数据库?无论如何)。如果它只是不够小心提供示例代码;您可能想指向一个静态URL并将标记内容的一部分添加到其中,这就是我在这里所做的。)

答案 2 :(得分:1)

str_replace()将是您的最佳选择:

function bar($foo) {
   $user = 'Cobb';
   return str_replace('[user]', $user, $foo);
}

$foo = 'Yo [user] I heard you like dreams so I put a dream in yo dream in yo dream so you can dream while you dream while you dream.'
$foo = bar($foo);
print $foo; // Will print "Yo Cobb I heard you like dreams so I put a dream in yo dream in yo dream so you can dream while you dream while you dream."

答案 3 :(得分:0)

  

str_replace怎么办?

function bar(foo)
return str_replace($arrayWithStringsToGetReplaced,
                   $arrayWithStringsToReplaceWith,
                   $foo)
     

如果我理解以下评论   正确。

这显然超出了我的范围。继续......:)

答案 4 :(得分:-1)

Regular Expressions是要走的路。很难,但学习它们所获得的好处远远超过了学习所需的努力。

来自php.net

<?php
$text = 'The price is PRICE ';

$lookFor = 'PRICE';
$replacement = '$100';

echo $replacement.'<br />';
//will display
//$100


echo str_replace($lookFor, $replacement, $text).'<br />';
//Will display
//The price is $100
?>