How to use regex to delete everything except some

2019-07-27 09:42发布

Possible Duplicate:
Regular expression: match all words except

I need your help for using Regex in PHP to negate a selection. So I have a string like this : "Hello my name is tom"

What I need to do is to delete everything from this string witch is not "tom" or "jack" or "alex" so I tried :

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

But it's not working...

Can you help me with that ? Thanks

4条回答
▲ chillily
2楼-- · 2019-07-27 09:55

You could match what you want and then reconstruct the string:

$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;

Output:

tomjackalex
查看更多
Rolldiameter
3楼-- · 2019-07-27 10:04

If you want to delete everything except something, may be it's better done the other way around: capture the something only? For example...

$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

What you've tried to do is use a character class syntax ([^s] will match any character but s). But this doesn't work with series of characters, there's no such thing as 'word class'. )

查看更多
劫难
4楼-- · 2019-07-27 10:06

regex:

\b(?!tom|jack|alex)[^\s]+\b
查看更多
爷、活的狠高调
5楼-- · 2019-07-27 10:12

If you want to remove everything that is not "tom" or "jack" or "alex" you can use the following:

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

This replaces the whole string with just the matched name.

查看更多
登录 后发表回答