假设我有一个类似
的字符串“学生-John Doe吃了苹果”
“学生-鲍勃吃了橘子”
我知道这句话包括:":type - :who ate :noun
是否有一种方法可以利用两个字符串,例如:
$arr = [
"type" => "Student",
"who" => "John Doe",
"noun" => "apples"
];
$arr2 = [
"type" => "Student"
"who" => "Bob",
"noun" => "oranges"
];
用php实现此目的的方法是什么?
-我想不出任何办法来实现它,所以我不能放任何代码块。
-可能我什至无法正确地命名问题,如果您有任何想法,我将不胜感激。
答案 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);
答案 2 :(得分:0)
您还可以将字符串拆分为划分不同部分的字符模式。
$result = array_combine(['type', 'who', 'noun'], preg_split('/ - | ate /', $example));
这应该可靠地工作,假设没有Bob的人吃过饭或类似的东西。