2011-01-11 48 views
1

考虑以下几点:如何替换字符串中的自定义“标签”?

$ FOO =“哟[用户科布]我听说你喜欢的梦想,所以我把梦哟梦想哟梦,所以你可以在你的梦想,而你如梦之梦”

我想做到这一点:

$富=酒吧($ foo的);

echo $ foo;

而得到这样的:

Cobb我听说你喜欢的梦想,所以我把梦哟梦想哟梦,所以你可以在你的梦想,而你的梦想的梦想。

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

伪代码很好,但实际的代码将不胜感激。

编辑:

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

编辑:

所有str_replace函数的答案是不正确的标签包含变量的内容。

+0

是否有自定义打开和关闭标记用于格式化(如BBCodes),或者这些只是用其他字符串替换某些字符串的占位符? – dqhendricks 2011-01-11 19:52:49

+0

@dqhendricks:谢谢你提醒我回答。我更新了我的问题。 – 2011-01-11 19:58:12

+0

即使替换是一个变量,它仍然是一个简单的占位符被替换为正确的值?或者是否有打开和关闭的标签用于格式化它们之间的内容,比如BBCodes?意思是,[b]格式化的字符串[/ b]将替换为格式化的字符串,以及类似的东西。 – dqhendricks 2011-01-11 20:02:02

回答

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; 
      } 
     } 
    } 
} 

您可以通过添加更多的情况下开关添加更多的功能。

0

str_replace怎么样?

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

如果我正确理解 以下的意见。

这显然超出了我。继续前进... :)

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." 
0

正则表达式是要走的路。很难,但是从学习中获得的好处远远超过了学习所需的努力。

php.net

<?php 

$文字= '的价格是价格';

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

echo $ replacement。'
'; //将显示 // $ 100

echo str_replace($ lookFor,$ replacement,$ text)。'
'; //将显示 //价格为$ 100 ?>

2

由于代码包含要分析和不是静态被替换,你必须使用正则表达式的标签内容。 (这是最简单的方法)

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修饰符将使匹配不区分大小写。如果您希望区分大小写,请将其删除。


(比如你给了来自[用户科布]解析到维基百科网址莱昂纳多dicabrio,这是在没有对应既不user也不Cobb。所以,不管你到了那里,你就必须做到这一点(查询如果它只是不够小心提供示例代码;您可能希望指向一个静态url并将标记内容的一部分添加到它,这就是我在这里所做的。)

1

最好的做法是使用BBCode解析器。

http://php.net/manual/en/book.bbcode.php

这分析器更快,不易出错,而且肯定比使用正则表达式更安全。但是,您必须自己安装PECL扩展,因为它不附带标准PHP安装。

1

也许您仍然对此代码感兴趣?

$ yourcodewithoutlinks =的preg_replace( '/(.*?)< \/A> /', “\ 2”,$ yourcodewithlinks)

找到了这个网页由你想要的东西在谷歌搜索,并做不想删除所有的HTML,找不到我想要的,并写下它myse

相关问题