#php #string
#php #строка
Вопрос:
Я новичок в php и понятия не имею, как извлечь именно то, что я хочу, из строки. например:
Instant Oats Drink - Chocolate Flavour 165g (33g x 5)
Я хочу извлечь эти данные, чтобы
Name: Instant Oats Drink - Chocolate Flavour
Weight: 165g
number of pack: 5
unit weight: 33g
Пожалуйста, дайте мне некоторую помощь по этому вопросу.
Комментарии:
1. Насколько предсказуемы, единообразны и стандартизированы эти строки? Легко извлечь информацию из этой конкретной строки, но я полагаю, вы захотите сделать это для нескольких разных строк автоматически…
2. preg_match должен сделать свое дело, но чтобы снабдить эту функцию правильным регулярным выражением, мы должны знать, насколько однородны строки, которые вы хотите проанализировать.
3. пожалуйста, дайте несколько советов..
4. хорошо, вопрос мог бы быть более точным, но почему он был отклонен? насколько я понимаю, он пытается разобрать «кулинарные рецепты», что является довольно интересной задачей.
5. @red23jordan Вдохновение для первого примера. Однако это не принесет ничего хорошего со вторым примером.
Ответ №1:
Если все ваши строки имеют одинаковую форму, вы можете использовать регулярные выражения.
учтите, что :
<?php
$str = "Instant Oats Drink - Chocolate Flavour 165g (33g x 5)";
preg_match('/(?P<title>[a-zA-Zs-]*)(?P<grammars>[0-9]*g)(s ()(?P<portion>[0-9] g)(s xs )(?P<times>[0-9] )())/', $str, $m);
echo "Title : " . $m['title'] . '<br />';
echo "Grammars : " . $m['grammars'] . '<br />';
echo "Portion : " . $m['portion'] . '<br />';
echo "Times : " . $m['times'] . '<br />';
?>
Основываясь на ответе @Troy, вы можете даже использовать тот, который даже сортируется
<?php
$str = "Instant Oats Drink - Chocolate Flavour 165g (33g x 5)";
preg_match('/(?P<title>.*) (?P<grammars>d g) ((?P<portion>d g) x (?P<times>d ))/', $str, $m);
echo "Title : " . $m['title'] . '<br />';
echo "Grammars : " . $m['grammars'] . '<br />';
echo "Portion : " . $m['portion'] . '<br />';
echo "Times : " . $m['times'] . '<br />';
?>
Комментарии:
1. в комментариях уже установлено, что все строки не имеют одинаковой формы.
2. действительно?? вы просмотрели список описаний продуктов на сайте, на который он ссылался?
3. должен ли я перечислить все возможные шаблоны?
4. Что вы имеете в виду? Не могли бы вы быть более конкретными? 😕
5. Поскольку я не знаю регулярного выражения. Я просто говорю то, что думаю 🙂 самая простая часть, которую мы можем извлечь, — это вес … поскольку единицы веса g, mL, L и т.д…
Ответ №2:
Для извлечения данных из строк в php вы можете использовать такие функции, как preg_match, explode, ereg
Вам нужно будет более точно определить точный формат, в котором будут все строки, чтобы это работало правильно, потому что вам нужно иметь определенный формат данных, который вы ищете с помощью функций thee.
Ответ №3:
Если строки различаются так сильно, как вы предполагаете, то будет практически невозможно сделать это точно. И это на любом языке; ничто в PHP не сделает это проще или сложнее: это проблема синтаксического анализа естественного языка, и ее действительно сложно автоматизировать.
Регулярное выражение (с использованием preg_split()
функции) может выполнить эту работу, если строки являются регулярными, но не для строк с произвольной формулировкой, подобных этим. Каждый из них является отдельным частным случаем, поэтому вам придется написать отдельный бит кода для каждого из них… но в этом случае вы могли бы с таким же успехом выполнить разделение вручную.
Единственный способ получить такие данные без ручного вмешательства — это если поставщик данных (т. Е. Сайт, На Который вы ссылались в комментариях?) может предоставить его предварительно отформатированным. Возможно, у них уже есть данные, разделенные на требуемый формат в их собственной базе данных продуктов, поэтому, если они готовы предоставить его, это сработает для вас.
Они почти наверняка захотят взимать с вас плату за данные, но, учитывая количество усилий, затраченных на выполнение этого вручную самостоятельно, это, вероятно, того стоило.
Ответ №4:
Я не уверен, насколько конкретный ответ вы ищете, но вот регулярное выражение, которое «анализирует» вашу строку. Это будет работать для любой строки, которая точно соответствует тому же шаблону.
<?php
$s = "Instant Oats Drink - Chocolate Flavour 165g (33g x 5)";
preg_match("/(.*) (d g) ((d g) x (d ))/", $s, $matches);
var_dump($matches);
?>
Выводит:
array(5) {
[0]=>
string(53) "Instant Oats Drink - Chocolate Flavour 165g (33g x 5)"
[1]=>
string(38) "Instant Oats Drink - Chocolate Flavour"
[2]=>
string(4) "165g"
[3]=>
string(3) "33g"
[4]=>
string(1) "5"
}