PHP Regex每组2个单词

时间:2014-04-04 10:39:39

标签: php regex

我一直在想,是否可以使用正则表达式对每两个单词进行分组?我用1个字:

((?:\w'|\w|-)+)

这很有效。但我需要它2(或更晚的话)。

但如果我使用这个:

((?:\w'|\w|-)+) ((?:\w'|\w|-)+)它会组成2组,但不是我想要的。当它遇到一个特殊的字符时,它将重新开始。

让我举个例子:

如果我在此文字上使用它:This is an . example text using & my / Regex expression

它会成群 This is example text regex expression

我想要这样的团体: This is is an an example example text text using using my my regex regex expression

如果它在a之后重置是没关系的。因此,例如它不会与hello . guys匹配。

这甚至可以实现吗?我刚开始尝试使用RegEx,所以我不太清楚这种可能性。

如果这是不可能的,你能否指出我应该对我的问题采取的方向?

提前致谢!

3 个答案:

答案 0 :(得分:2)

正则表达式对此有些过分。只需收集单词,然后创建对:

$a = array('one', 'two', 'three', 'four');

$pairs = array();
$prev = null;
foreach($a as $word) {
    if ($prev !== null) {
        $pairs[] = "$prev $word";
    }
    $prev = $word;
}

现场演示:http://ideone.com/8dqAkz

答案 1 :(得分:1)

试试这个

$samp = "This is an . example text using & my / Regex expression";

//removes anything other than alphabets
$samp = preg_replace('/[^A-Z ]/i', "", $samp);

//removes extra spaces
$samp = str_replace("  "," ",$samp);

//the following code splits the sentence into words
$jk = explode(" ",$samp);

$i = sizeof($jk);
$j = 0;

//this combines words in desired format
$array="";
for($j=0;$j<$i-1;$j++)
{
    $array[] = $jk[$j]." ".$jk[$j+1];
}

print_r($array);

Demo

修改

您的问题

  

我已经改变了这样的正则表达式:&#34; / [^ A-Z0-9 - &#39; ] I&#34 /;所以它没有   把你喜欢的词弄得一团糟'#t;&#39;和#9岁的&#39;例如。但通过做   当有一个单独的 - 或者&#39;在我的文中,它会对待那些   作为一个单独的话。我知道为什么会这样做但是可以预防吗?

像这样改变正则​​表达式

preg_replace('/[^A-Z0-9 ]+[^A-Z0-9\'-]/i', "", $samp)

Demo

答案 2 :(得分:0)

首先,删除非单词字符(将\W替换为'')然后执行您的匹配。通过分解它们可以使许多问题变得更简单。正则表达式也不例外。

或者,删除非单词字符,将空格压缩到单个空格中,然后在空格上使用explode,并array_chunk将单词分组成对。