0

假设我有一个输入,例如:

$input = "This is some sample input, it's not complex. ";
$input .="But does contain punctuation such as full stops / back-slashes / etc";
$array = arrayFunction($input);

我的问题是:我需要做什么arrayFunction才能$array等于以下内容:

$array = array(
    0 =>  "This",
    1 =>  "is",
    2 =>  "some",
    3 =>  "sample",
    4 =>  "input",
    5 =>  ",",
    6 =>  "it's",
    7 =>  "not",
    8 =>  "complex",
    9 =>  ".",
    10 =>  "But",
    11 =>  "does",
    12 =>  "contain",
    13 =>  "punctuation",
    14 =>  "such",
    15 =>  "as",
    16 =>  "full",
    17 =>  "stops",
    18 =>  "/",
    19 =>  "back-slashes",
    20 =>  "etc",
);

我一直在做以下事情

function arrayFunction($input)
{
    $explode = explode( " ", $input );
    $output  = array();
    foreach ( $explode as $word )
    {
        $output[] = trim( \String::lower( preg_replace('/[^\w|\s|-]+/', '', $word ) ) );
    }

    return $output;
}

这对我的需要很好,但现在我需要输出包含标点符号,以便我可以通过以下测试:

$input  = "This is some sample input, it's not complex.";
$input .= "But does contain punctuation such as full stops/back-slashes/etc";
$array  = arrayFunction($input);

$test  = implode(' ', $array);
if ($test == $input) {
  echo 'PASS';
} else {
  echo 'FAIL';
}

谢谢。

编辑我正在考虑这样做的方式是按空格爆炸,然后循环该结果并通过标点符号进一步拆分。

编辑感谢下面接受的答案,我能够将我的代码重写为有效的东西。对于那些感兴趣的人,可以在这里看到https://gist.github.com/carbontwelve/6639350

4

2 回答 2

1

这将产生您想要的数组:

function arrayFunction($input) {
    return preg_split('/(\s|[\.,\/])/', $input, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
}

但是,因为您想通过测试,您需要知道空格在哪里,所以我可以建议'/([\s\.,\/])/'您作为正则表达式,但是您需要去除空值以获得所需的数组。此外,要使用建议的正则表达式通过测试,您需要在$test = implode("", $array);没有空格的情况下进行。

于 2013-09-20T14:55:21.210 回答
1

对于测试也使用较低的功能

if (\String::lower($test) == \String::lower($input)) {
  echo "PASS";
}

还用于检查 $test 和 $input 字符串的输出并将其可视化

于 2013-09-20T14:56:29.507 回答