Сопоставить заданные строки в строке и вывести массив - PullRequest
0 голосов
/ 09 января 2019

Допустим, у меня есть строка типа

"Студент - Джон Доу ел яблоки"

"Студент - Боб ел апельсины"

Я знаю, что это предложение состоит из: ":type - :who ate :noun

Есть ли способ получить массив действий, используя обе строки, такие как:

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

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

Как добиться этого в php?

- Я не мог придумать ни одного способа добиться этого, поэтому я не могу добавить куски кода.

- Возможно, я даже не смог правильно назвать вопрос, я был бы признателен, если бы у вас была идея

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Вы можете использовать регулярное выражение с именованными группами. Предполагается, что входная строка $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"
]
0 голосов
/ 09 января 2019

Вы также можете разбить строку по шаблонам символов, которые разделяют различные части.

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

Это должно работать надежно, при условии, что нет Боба, который ел, или что-то в этом роде.

0 голосов
/ 09 января 2019

На самом деле это можно сделать без каких-либо регулярных выражений, если у вас действительно есть строгие правила, приведенные в вашем обновленном вопросе. Сначала разделите тире, чтобы получить тип, а затем разделите остальное на «съел», чтобы получить человека и существительное.

$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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...