我想在这里有这个字符串:$string = 'hello my name is "nicholas cage"'
。
我想将这些单词分成不同的字符串,如下所示:
$word1 = 'hello';
$word2 = 'my';
$word3 = 'name';
$word4 = 'is';
$word5 = 'nicholas cage';
对于前4个单词我可以使用爆炸。但是我如何处理word5?我希望名字和姓氏是一个字符串。
答案 0 :(得分:7)
如果需要,您还可以使用字符串函数:str_getcsv。只需调用分隔符“”而不是“,”;
示例:$array = str_getcsv($string, " ");
答案 1 :(得分:4)
这可以使用regexp来完成:
$string = 'hello my name is "nicholas cage"';
preg_match_all('/(?:"[^"]*"|\S+)/', $string, $matches);
print_r($matches[0]);
它的工作原理如下:
"[^"]*"
- 双引号中的任何内容\S+
- 超过1个非空格字符但这个结果是引用的。删除它们:
$words = array_map('remove_starting_ending_quotes', $matches[0]);
print_r($words);
function remove_starting_ending_quotes($str) {
if (preg_match('/^"(.*)"$/', $str, $matches)) {
return $matches[1];
}
else {
return $str;
}
}
现在结果与预期完全一致:
Array
(
[0] => hello
[1] => my
[2] => name
[3] => is
[4] => nicholas cage
)
答案 2 :(得分:3)
您可以使用此正则表达式:
/"[^"]*"|\S+/
你可以像这样使用它:
<?php
$target = 'Hello my name is "Nicholas Cage"';
$pattern = '/"[^"]*"|\S+/';
$matches = array();
preg_match_all($pattern,$target,$matches);
var_dump($matches);
?>
答案 3 :(得分:0)
你可以做$bits = explode(' ', $string);
,这会给你:你好,我的,名字,是,尼古拉斯,笼子,但是没有办法让它知道“尼古拉斯笼子”是一个实体。
我不确定如何做你想要的,你可能需要交叉引用字典数据库并加入任何未找到的单词。
编辑:我看到你现在引用了“nicholas cage”,在这种情况下你可以使用正则表达式,例如:preg_match('/([\s"])(.*?)$1/', $str, $matches);
答案 4 :(得分:0)
通过解析完成。谷歌“递归下降”。
答案 5 :(得分:0)
这对我有用
$word1 = 'hello';
$word2 = 'my';
$word3 = 'name';
$word4 = 'is';
$word5 = 'nicholas cage';
$my = array($word1,$word2,$word3,$word4,$word5);
function word_split($str=array(),$words=1) {
foreach($str as $str)
{
$arr = preg_split("/[\s]+/", $str,$words+0);
$arr = array_slice($arr,0,$words);
}
return join(' ',$arr);
}
echo word_split($my,1);
返回尼古拉斯笼