php函数将字符串分成不同的字符串?

时间:2009-12-03 23:34:52

标签: php

我想在这里有这个字符串:$string = 'hello my name is "nicholas cage"'

我想将这些单词分成不同的字符串,如下所示:

$word1 = 'hello';
$word2 = 'my';
$word3 = 'name';
$word4 = 'is';
$word5 = 'nicholas cage';

对于前4个单词我可以使用爆炸。但是我如何处理word5?我希望名字和姓氏是一个字符串。

6 个答案:

答案 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);

返回尼古拉斯笼