匹配字符串中的给定字符串并输出数组

时间:2019-01-08 21:32:30

标签: php arrays regex string

假设我有一个类似

的字符串
  

“学生-John Doe吃了苹果”

     

“学生-鲍勃吃了橘子”

我知道这句话包括:":type - :who ate :noun

是否有一种方法可以利用两个字符串,例如:

$arr = [
   "type" => "Student",
   "who" => "John Doe",
   "noun" => "apples"
];

$arr2 = [
   "type" => "Student"
   "who" => "Bob",
   "noun" => "oranges"
];

用php实现此目的的方法是什么?

-我想不出任何办法来实现它,所以我不能放任何代码块。

-可能我什至无法正确地命名问题,如果您有任何想法,我将不胜感激。

3 个答案:

答案 0 :(得分:2)

您可以将正则表达式与命名组一起使用。假设输入字符串为$str

preg_match("/^(?<type>\w+)\s+-\s+(?<who>\w+(?:\s+\w+)*)\s+ate\s+(?<noun>\w+)$/", 
           $str, $match);

这会将$match设置为所需的位数,但是您可以从中获取所需的内容:

[
   0 => "Student - John Doe ate apples",
   "type" => "Student",
   1 => "Student",
   "who" => "John Doe",
   2 => "John Doe",
   "noun" => "apples",
   3 => "apples"
]

答案 1 :(得分:1)

如果您确实有更新问题中给出的严格规则,那么实际上可以在不使用任何正则表达式的情况下完成此操作。首先用破折号分隔以获取类型,然后将其余部分按“ ate”分隔以获取人和名词。

$strings = array("Student - John Doe ate apples", "Student - Bob ate oranges");
$breakdown = array();

foreach($strings as $line)
{
    $mainParts = explode("-", $line);
    $type = trim($mainParts[0]);
    $subPart = explode(" ate ", $mainParts[1]);
    $who = trim($subPart[0]);
    $noun = trim($subPart[1]);

    $breakdown[] = array("type" => $type, "who" => $who, "noun" => $noun);
}

var_dump($breakdown);

DEMO

答案 2 :(得分:0)

您还可以将字符串拆分为划分不同部分的字符模式。

$result = array_combine(['type', 'who', 'noun'], preg_split('/ - | ate /', $example));

这应该可靠地工作,假设没有Bob的人吃过饭或类似的东西。