Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用正则表达式删除除某些单词以外的所有内容?_Php_Regex_Preg Replace - Fatal编程技术网

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

Php 如何使用正则表达式删除除某些单词以外的所有内容?,php,regex,preg-replace,Php,Regex,Preg Replace,可能重复: 我需要你的帮助,在PHP中使用正则表达式来否定选择。所以我有一个这样的字符串: 你好,我叫汤姆 我需要做的是删除这个字符串中的所有内容,而不是tom、jack或alex,所以我尝试: $MyString = "Hello my name is tom" print_r(preg_replace('#^tom|^jack|^alex#i', '', $MyString)); 但它不起作用 你能帮我吗? 谢谢正则表达式: \b(?!tom|jack|alex)[^\s]+\b 正则

可能重复:

我需要你的帮助,在PHP中使用正则表达式来否定选择。所以我有一个这样的字符串: 你好,我叫汤姆

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

$MyString = "Hello my name is tom"
print_r(preg_replace('#^tom|^jack|^alex#i', '', $MyString));
但它不起作用

你能帮我吗? 谢谢

正则表达式:

\b(?!tom|jack|alex)[^\s]+\b
正则表达式:


如果你想删除除某些内容以外的所有内容,那么最好用另一种方式:只捕获某些内容?例如

$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以外的任何字符。但是这不适用于一系列字符,没有“word类”这样的东西

如果你想删除除某物以外的所有内容,那么最好用另一种方式:只捕获某物?例如

$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以外的任何字符。但是这不适用于一系列字符,没有“word类”这样的东西

如果你想移除所有不是tom、jack或alex的东西,你可以使用以下方法:

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

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

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

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

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

您可以匹配所需的名称,然后重建字符串:

$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

您可以匹配所需内容,然后重建字符串:

$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


如果他那样做了,他只会把任何汤姆/杰克/亚历克斯换成一无所有。他想做完全相反的事。@H2Ooooo:谢谢。更正。如果他那样做了,他只会把汤姆/杰克/亚历克斯换成一无所有。他想做完全相反的事。@H2Ooooo:谢谢。更正。从您实际需要的匹配项构建新字符串应该更容易。从您实际需要的匹配项构建新字符串应该更容易。我尝试过,它在这个正则表达式中工作得更好。“*tom | jack | alex.*I”,因为没有。*结尾,它不会在匹配后破坏字符串的结尾,还有什么“我的名字叫汤姆,我不是杰克”的字符串会出现吗?我看不出*的问题,这意味着该字符可以被使用0次或更多次不?,但你仍然帮助了我-它不会在结尾删除不需要的字符串partI尝试了它,它在这个正则表达式中工作得更好。“*tom | jack | alex.*i”,因为没有。*在结尾,它不会在匹配后破坏字符串的结尾,那么“我的名字是tom,我不是jack”字符串会发生什么?我看不出*的问题,这意味着该字符可以被使用0次或更多次不?,但你仍然帮助了我-它不会删除结尾部分不需要的字符串谢谢你的回复,但是为什么要使用$result=infrade,$matches[0];最后呢$匹配项[0]不是数组吗?我看到了另一个解释使用“.*tom | jack | alex.*I”的答案,但你认为使用preg|u match更好吗?我真的不明白为什么$matches[0]实际上是一个数组,因此调用了introde。另一个答案将很好地删除原始字符串中的所有ToS/JACK/ Alxes副本,因此我认为我的解决方案略优于它。我花了一段时间才明白,这不是替换,而是将所需的名称提取到一个新数组中,然后将该新数组内爆为一个包含名称的字符串。聪明。谢谢你的回复,但是为什么要使用$result=infrade,$matches[0];最后呢$匹配项[0]不是数组吗?我看到了另一个解释使用“.*tom | jack | alex.*I”的答案,但你认为使用preg|u match更好吗?我真的不明白为什么$matches[0]实际上是一个数组,因此调用了introde。另一个答案将很好地删除原始字符串中的所有ToS/JACK/ Alxes副本,因此我认为我的解决方案略优于它。我花了一段时间才明白,这不是替换,而是将所需的名称提取到一个新数组中,然后将该新数组内爆为一个包含名称的字符串。聪明的