2011-05-02 87 views
2

我清理一个字符串数组中删除字符串:帮助str_replace()函数

$regex = array("subida", " de"," do", " da", "em", " na", " no", "blitz"); 

这是我使用的str_replace函数:

for($i=0;$i<8;$i++){ 
    $twit = str_replace($regex[$i],'', $twit); 
} 

我如何让它只删除一个单词,如果它正好是字符串中的单词,我的意思是,我有以下短语: “#blitz na subida do alfabarra blitz” 它会返回我: “#alfabarra”, 我不想第一个“闪电战”被删除,因为它有一个哈希“#”,我希望它输出: “#blitz alfabarra”,可能吗?谢谢

+2

您的变量('$ regex')的名称,你没有使用在所有的正则表达式是一种误导。实际上,'str_replace'接受和数组,所以你可以做'$ twit = str_replace($ regex,'',$ twit);' – 2011-05-02 13:29:04

回答

5

这里假定你的字符串都没有/。如果是这样,请以/作为第二个参数,明确运行preg_quote()

它也假定你想匹配的话,所以我修剪每个单词。

$words = array("subida", " de"," do", " da", "em", " na", " no", "blitz"); 

$words = array_map('trim', $words); 

$words = array_map('preg_quote', $words); 

$str = preg_replace('/\b[^#](?:' . implode('|', $words) . ')\b/', '', $str); 

Codepad

+0

真棒,非常感谢。 – 2011-05-02 13:38:42

+0

有正则表达式的轻微警告:可以删除由于角色类而导致的“ablitz”字样。正则表达式在这里失败了,所以用单词array_diff代替。 – cmbuckley 2011-05-05 14:39:04

+0

@cbuckley嗯,你是对的。我将不得不有另一种想法:) – alex 2011-05-05 23:14:18

1

未能拿出一个包罗万象的正则表达式的解决方案后,下面可能是有用的:

$words = array("subida", " de", " do", " da", "em", " na", " no", "blitz"); 
$words = array_map('trim', $words); 

$str = '#blitz *blitz ablitz na subida do alfabarra blitz# blitz blitza'; 

$str_words = explode(' ', $str); 
$str_words = array_diff($str_words, $words); 
$str = implode(' ', $str_words); 
var_dump($str); 

获取一轮基于正则表达式的解决方案字边界的并发症少。

0

试试这个:

for($i=0; $i<$regex('count'); $i++){ 
    foreach($regex[$i] as $key) { 
     if (is_string($key)) { 
      $twit = str_replace($regex[$i],'', $twit); 
     } 
    } 
}