我正在尝试写一个小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);
答案 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
,就可以摆脱它。此外,根据您是否需要$storyArray
,preg_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] + " ";
在这一行,你应该使用。运算符以连接字符串。