/ / Jak podzielisz ciąg na pary słów? - php, regex, tablice, łańcuch znaków

Jak podzielisz ciąg na pary słów? - php, regex, tablice, łańcuch znaków

Próbuję podzielić ciąg na tablicę par słów w PHP. Na przykład jeśli masz ciąg wejściowy:

"split this string into word pairs please"

tablica wyjściowa powinna wyglądać

Array (
[0] => split this
[1] => this string
[2] => string into
[3] => into word
[4] => word pairs
[5] => pairs please
[6] => please
)

niektóre nieudane próby obejmują:

$array = preg_split("/w+s+w+/", $string);

co daje mi pustą tablicę, i

preg_match("/w+s+w+/", $string, $array);

który dzieli łańcuch na pary słów, ale nie powtarza słowa. Czy istnieje prosty sposób na wykonanie tego?

Odpowiedzi:

9 dla odpowiedzi № 1

Dlaczego po prostu nie użyć eksplodować?

$str = "split this string into word pairs please";

$arr = explode(" ",$str);
$result = array();
for($i=0;$i<count($arr)-1;$i++) {
$result[] =  $arr[$i]." ".$arr[$i+1];
}
$result[] =  $arr[$i];

Łącze robocze


2 dla odpowiedzi nr 2

Jeśli chcesz powtórzyć za pomocą wyrażenia regularnego, będziesz potrzebował jakiegoś spojrzenia z wyprzedzeniem lub spoglądania w przeciwnym kierunku. W przeciwnym razie wyrażenie nie będzie pasowało do tego samego słowa wiele razy:

$s = "split this string into word pairs please";
preg_match_all("/(w+) (?=(w+))/", $s, $matches, PREG_SET_ORDER);
$a = array_map(
function($a)
{
return $a[1]." ".$a[2];
},
$matches
);
var_dump($a);

Wydajność:

array(6) {
[0]=>
string(10) "split this"
[1]=>
string(11) "this string"
[2]=>
string(11) "string into"
[3]=>
string(9) "into word"
[4]=>
string(10) "word pairs"
[5]=>
string(12) "pairs please"
}

Zauważ, że nie powtarza ostatniego słowa "proszę", jak żądałeś, chociaż nie jestem pewien, dlaczego chcesz tego zachowania.


1 dla odpowiedzi nr 3

Mógłbyś explode ciąg, a następnie przepuszczaj go przez pętlę:

$str = "split this string into word pairs please";
$strSplit = explode(" ", $str);
$final = array();

for($i=0, $j=0; $i<count($strSplit); $i++, $j++)
{
$final[$j] = $strSplit[$i] . " " . $strSplit[$i+1];
}

Myślę, że to działa, ale powinno być łatwiejsze rozwiązanie.

Edytowane w celu dostosowania go do specyfikacji OP. - zgodnie z kodaddict


1 dla odpowiedzi nr 4
$s = "split this string into word pairs please";

$b1 = $b2 = explode(" ", $s);
array_shift($b2);
$r = array_map(function($a, $b) { return "$a $b"; }, $b1, $b2);

print_r($r);

daje:

Array
(
[0] => split this
[1] => this string
[2] => string into
[3] => into word
[4] => word pairs
[5] => pairs please
[6] => please
)