我需要一个正则表达式来匹配所有单个单词和每两个单词

时间:2015-03-16 15:32:31

标签: php regex preg-match-all

我正在使用PHP preg_match_all函数,我需要它来返回每个单词和每对单词的数组,包括那些单词,例如:

preg_match_all('/the regex/','Stackoverflow is awesome',$matches);

$ matches数组应包含:

(' Stackoverflow',',#39;棒极了'' Stackoverflow是','很棒' )

我已尝试使用此正则表达式但未获得预期结果:

[A-Z] + \ S?[A-Z] *

5 个答案:

答案 0 :(得分:2)

我认为你不能用正则表达式实现这一点。我会说,使用explode并自己构建数组。

$string = 'Stackoverflow is awesome';
$parts = explode(' ', $string);
for ($i = 1; $i < count($parts); $i++) {
    $parts[] = $parts[$i - 1] . ' ' . $parts[$i];
}

答案 1 :(得分:1)

使用\S+匹配所有字词。然后你执行\S+\s+\S+,它将与之前匹配的字符不匹配,因为默认情况下正则表达式不会重叠匹配。为了使正则表达式引擎进行重叠匹配,您需要在捕获组内一次放置匹配两个单词的模式,并将捕获组置于正面看法中。

$s = "Stackoverflow is awesome";
$regex = '~(?=(\S+\s+\S+))|\S+~';
preg_match_all($regex, $s, $matches);
$matches = array_values(array_filter(call_user_func_array('array_merge', $matches)));
print_r($matches);

<强>输出:

Array
(
    [0] => Stackoverflow
    [1] => is
    [2] => awesome
    [3] => Stackoverflow is
    [4] => is awesome
)

答案 2 :(得分:0)

这限制了两个单词的措辞。

<?php
$str = "Stackoverflow is awesome";
$words = explode(" ",$str);
$num_words = count($words);
for ($i = 0; $i < $num_words; $i++) {
  for ($j = $i; $j < $num_words; $j++) {
    $num = 0;

    $temp = "";
    for ($k = $i; $k <= $j; $k++) { 
       $num++;
       $temp .= $words[$k] . " ";             
    }

    if($num < 3)
    echo $temp . "<br />";
  }
}
?>

答案 3 :(得分:0)

试试这个简单的正则表达式

 /\w+/i

重写:

     preg_match_all('/\w+/i','Stackoverflow is awesome',$matches);
 print_r($matches);

在操作 here

中查看此内容

答案 4 :(得分:0)

您可以在此处使用前瞻:

preg_match_all('/(?=(\b(\w+)(?:\s+(\w+)\b|$)))/','Stackoverflow is awesome',$matches);

现在双话:

print_r($matches[1]);
Array
(
    [0] => Stackoverflow is
    [1] => is awesome
    [2] => awesome
)

单词:

print_r($matches[2]);
Array
(
    [0] => Stackoverflow
    [1] => is
    [2] => awesome
)

PS: awesome也会以双字打印,因为它是最后一个字。