REGEX打印句子中的每个替代单词

时间:2011-05-27 16:07:03

标签: php regex

假设我有一个字符串:

$s= "The quick brown fox jumps over the lazy dog"

我想使用php正则表达式函数来检索句子中的每个替代单词。与上述句子一样,输出应为:

The brown jumps the dog

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:5)

您可以用第一个单词替换每两个单词。所以,替换

(\w+) \w+

$1

preg_replace('/(\w+) \w+/', "$1", 'The quick brown fox jumps over the lazy dog')

快速测试:

php -r 'echo preg_replace("/(\w+) \w+/", "$1", "The quick brown fox jumps over the lazy dog");'
The brown jumps the dog

如果您希望保留第二,第四等单词,则可以将正则表达式调整为

\w+ (\w+)

将第二个单词放入捕获组。然而。这将保留最后一个字,即使字数是奇数:

php -r "echo preg_replace('/\\w+ (\\w+)/', '\\1', 'The quick brown fox jumps over the lazy dog'),\"\\n\";"
quick fox over lazy dog

最后看到流浪狗?要解决这个问题,如果没有一个单词,你需要删除最后一个单词:

\w+(?: (\w+))?

演示:

php -r "echo preg_replace('/\\w+(?: (\\w+))?/', '\\1', 'The quick brown fox jumps over the lazy dog'),\"\\n\";"
quick fox over lazy

(?:...)部分是所谓的非捕获组。它将对正则表达式的部分进行分组,而不捕获其内容以进行反向引用。这主要是因为您仍然可以替换$1而不是$2

答案 1 :(得分:0)

或者,如果要捕获数组中的匹配项:

preg_match_all('/(?|(\w+) \w+|(\w+)$)/', $s, $matches);
var_dump($matches[1]);

并抓住相反的位置:

preg_match_all('/\w+ (\w+)/', $s, $matches);
var_dump($matches[1]);