Php 如何使用正则表达式删除除某些单词以外的所有内容?
可能重复: 我需要你的帮助,在PHP中使用正则表达式来否定选择。所以我有一个这样的字符串: 你好,我叫汤姆 我需要做的是删除这个字符串中的所有内容,而不是tom、jack或alex,所以我尝试: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 正则
$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副本,因此我认为我的解决方案略优于它。我花了一段时间才明白,这不是替换,而是将所需的名称提取到一个新数组中,然后将该新数组内爆为一个包含名称的字符串。聪明的