如何使用正则表达式删除除了某些单词之外的所有内容?

时间:2012-06-15 10:49:05

标签: php regex preg-replace

  

可能重复:
  Regular expression: match all words except

我需要你的帮助才能在PHP中使用Regex来否定选择。所以我有一个像这样的字符串: “你好,我的名字是汤姆”

我需要做的是删除此字符串中的所有内容女巫不是“tom”或“jack”或“alex”所以我尝试过:

$MyString = "Hello my name is tom"
print_r(preg_replace('#^tom|^jack|^alex#i', '', $MyString));

但它不起作用......

你可以帮帮我吗? 感谢

4 个答案:

答案 0 :(得分:4)

如果您要删除除某些内容之外的所有内容,可能最好以相反方式完成:仅捕获某些内容?例如......

$testString = 'Hello my name is tom or jack';
$matches = array();
preg_match_all('/\b(tom|jack|alex)\b/i', $testString, $matches);
$result = implode('', $matches[0]);
echo $result; // tomjack

您尝试做的是使用字符类语法([^s]将匹配除s之外的任何字符)。但这不适用于一系列角色,没有“词类”这样的东西。 )

答案 1 :(得分:0)

正则表达式:

\b(?!tom|jack|alex)[^\s]+\b

答案 2 :(得分:0)

如果您要删除“tom”或“jack”或“alex”的所有内容,您可以使用以下内容:

$MyString = "Hello my name is jack";
print_r(preg_replace('#.*(tom|jack|alex)#i', '$1', $MyString));

这将仅使用匹配的名称替换整个字符串。

答案 3 :(得分:0)

您可以匹配您想要的内容,然后重新构建字符串:

$s = 'hello my name is tom, jack and alex';

if (preg_match_all('/(?:tom|jack|alex)/', $s, $matches)) {
print_r($matches);
        $s = join('', $matches[0]);
} else {
        $s = '';
}

echo $s;

输出:

tomjackalex
相关问题