无法在字符串中找到令牌

时间:2009-11-16 03:58:16

标签: php

我正在尝试写一个小PHP 申请,我正面临一个问题。 这假设得到如下文字:

  

这是*名词,但它是*名字。

和 应该采取开头的话 一个星星并将它们添加到字符串中 令牌。但是这不起作用。

// get list of fields (each should have words delimited by underscores
$storyArray = split(' ', $story);
$tokens = ""; // space-delimited list of fields
for ($i = 0; $i < count($storyArray); $i++) {
    if ($storyArray[$i][0] == '*')
        $tokens .= $storyArray[$i] + " ";
}
$tokensArray = split(' ', $tokens);

6 个答案:

答案 0 :(得分:9)

哇,我简直不敢相信我一直在调试这个并且错过了明显的错误!

这一行:

$tokens .= $storyArray[$i] + " ";

您必须与句点(.)连接,而不是加号!你现在所拥有的基本上与$tokens .= 0;

相同

答案 1 :(得分:4)

这对我有用:

$story = "this is *noun but it is *name";

$storyArray = split(' ', $story);
$tokens = array();
for ($i = 0; $i < count($storyArray); $i++) {
  if ($storyArray[$i][0] == '*') {
    array_push($tokens, substr($storyArray[$i], 1));
  }
}
var_dump($tokens);
$tokenString = implode(" ", $tokens);

请注意,我正在将令牌直接推入数组,然后将其插入。

答案 2 :(得分:3)

“+”用于添加,而不是字符串连接。它将其参数转换为数字,在源中始终为0。

另一方面,分割$tokens是不必要的。相反,将令牌附加到$tokensArray

$story = "this is *noun but it is *name";
// get list of fields (each should have words delimited by underscores
$storyArray = split(' ', $story);
$tokens = ""; // space-delimited list of fields
$tokensArray=array();
for ($i = 0; $i < count($storyArray); $i++) {
    if ($storyArray[$i][0] == '*') {  
        $tokens .= $storyArray[$i] . " ";
        $tokensArray[] = $storyArray[$i];
    }
}

如果您只需要$tokens来生成$tokensArray,就可以摆脱它。此外,根据您是否需要$storyArraypreg_match_all(...)可能会替换您的代码:

preg_match_all('/\*\w+/', $story, $tokensArray);
$tokensArray = $tokensArray[0];

答案 3 :(得分:3)

您也可以使用正则表达式来实现相同的效果,而不需要立即执行所有字符串操作。这将是最优雅的解决方案:

$string = "this is *noun but it is *name";

// Lets set up an empty array
$tokens = array();

preg_match_all('/\*\w+/m', $string, $tokens);
$tokens = $tokens[0]; // Only one sub-pattern, dropping unnecessary dimension.

var_dump($tokens);

正则表达式主要用于完成您现在要实现的任务类型。它们通常比手动执行字符串操作更快(PHP中的正则表达式引擎是编译代码)。

解释我的正则表达式:

  • /开始边界
  • \*星号(*
  • \w 任何字母数字字符或下划线
  • +之前的标记,1次或更多次。 (匹配\w一次或多次)
  • /结束边界
  • m多行修饰符

答案 4 :(得分:1)

替换

$tokens .= $storyArray[$i] + " ";

$tokens .= $storyArray[$i]." ";

$tokensArray = split(' ', $tokens);

$tokensArray = split(' ', rtrim($tokens));

答案 5 :(得分:1)

$tokens .= $storyArray[$i] + " ";

在这一行,你应该使用。运算符以连接字符串。