1

可能重复:
正则表达式:匹配所有单词,除了

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

我需要做的是从这个字符串中删除所有内容,而不是“tom”或“jack”或“alex”,所以我尝试了:

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

但它不工作...

你能帮我吗?谢谢

4

4 回答 4

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 之外的任何字符)。但这不适用于一系列字符,没有“单词类”之类的东西。)

于 2012-06-15T10:58:23.513 回答
0

正则表达式:

\b(?!tom|jack|alex)[^\s]+\b
于 2012-06-15T10:53:08.013 回答
0

如果要删除不是“tom”、“jack”或“alex”的所有内容,可以使用以下命令:

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

这会将整个字符串替换为匹配的名称。

于 2012-06-15T11:00:31.760 回答
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
于 2012-06-15T11:03:59.113 回答