Например, есть произвольные данные вида:
<table>
<tr>
<td>
тедди 464 864<br>
цвет 464 864 оранж<br>
крепич строительный<br>
состав — 100% глина<br>
вес — 1000г<br>
длина — 250 м<br>
производство — италия<br>
</td>
</tr>
</table>
Нужно получить отдельно данные по составу, весу и длине. Порядок вывода данных - произвольный, т.е. на разных страницах строки могут стоять друг за другом в хаотичном порядке.
Думаю, нужно разбить на массив по
и получить отдельно элементы массива со словом "состав", "вес" и "длина".
Пытался так:
$vivod = "<table>
<tr>
<td>
тедди 464 864<br>
цвет 464 864 оранж<br>
крепич строительный<br>
состав — 100% глина<br>
вес — 1000г<br>
длина — 250 м<br>
производство — италия<br>
</td>
</tr>
</table>";
$result = explode("<br>", $vivod);
print_r($result);
Но как получить элемент массива, внутри которого слово "состав", не могу понять. Нужна регулярка?
Скорее всего решением будет этот вариант:
$str = '<table>
<tr>
<td>
тедди 464 864<br>
цвет 464 864 оранж<br>
крепич строительный<br>
состав — 100% глина<br>
вес — 1000г<br>
длина — 250 м<br>
производство — италия<br>
</td>
</tr>
</table>';
$patt = '~(?:состав|вес|длина)\h—\h\K.+?(?=<br>)~';
preg_match_all($patt, $str, $arr);
list($composition, $weight, $length) = $arr[0];
Но не могу понять, почему не выводит echo $arr[0]; ? Как забрать каждое из значений?
Потому, что preg_match_all() возвращает двумерный массив, и для обращения к например составу нужно указывать два индекса echo $arr[0][0];
. Или для удобства использовать, как в моём примере, конструкцию list()
и обращение к переменным:
echo $composition; // состав
echo $weight; // вес
echo $length; // длина
UPD:
А возможно ли сделать выражение более универсальным, что бы оно находило строку, даже если ключевое слово находится за значением? пример: "250 м длина"
Если позиции искомых символов заранее неизвестны, тогда можно сперва искать вхождение ключевого слова в строку, и если строка найдена - передавать её на обработку следующему шаблону, а соответствия сохранять в одномерный массив, и можно обращаться к его элементам по индексу (например, echo[0];
). Ниже ваш html-код с прямой и обратной последовательностью искомых символов:
$str = '<table>
<tr>
<td>
тедди 464 864<br>
цвет 464 864 оранж<br>
крепич строительный<br>
состав — 100% глина<br>
вес — 1000г<br>
длина — 250 м<br>
250 м длина<br>
производство — италия<br>
</td>
</tr>
</table>';
$arr = [];
preg_replace_callback(
'~^.*?(?:состав|вес|длина).+~m',
function($m)use(&$arr){
preg_match('~\d+\S?\h?\w+~u', $m[0], $tmp);
$arr[] = $tmp[0];
},
$str
);
var_dump($arr);
Результат:
array (size=4)
0 => string '100% глина' (length=15)
1 => string '1000г' (length=6)
2 => string '250 м' (length=6)
3 => string '250 м' (length=6)
С помощью preg_match_all()
и шаблона регулярного выражения, выделяем группы символов, содержащих названия параметров и их значений, для всех строк, которые начинаются со слов состав/вес/длина
.
Далее, из полученного результата, формируем ассоциативный массив $output
: ключи - найденные параметры, значения - найденные значения параметров.
<?php
$input = '
<table>
<tr>
<td>
тедди 464 864<br>
цвет 464 864 оранж<br>
крепич строительный<br>
состав — 100% глина<br>
вес — 1000г<br>
длина — 250 м<br>
производство — италия<br>
</td>
</tr>
</table>';
$output = array();
if (preg_match_all('/^(состав|вес|длина)\s+—\s+([^<]+)</mui', $input, $m)) {
for ($i = 0; $i < count($m[0]); $i++) {
$output[$m[1][$i]] = $m[2][$i];
}
}
var_dump($output);
Результат:
array(3) {
'состав' =>
string(15) "100% глина"
'вес' =>
string(6) "1000г"
'длина' =>
string(6) "250 м"
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
как можно получить id пользователя, который не писал в чат боту, и имея только его @username, либо имея его id, который прислал другой пользователь...
Имею на машине LEMP серверПри попытке поставить на него phpmyadmin выдает ошибку