Забрать текст между <BR> регулярка php

85
02 мая 2021, 01:40

Например, есть произвольные данные вида:

<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);

Но как получить элемент массива, внутри которого слово "состав", не могу понять. Нужна регулярка?

Answer 1

Скорее всего решением будет этот вариант:

$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)
Answer 2

С помощью 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 м"
}
READ ALSO
Telegram получить id пользователя имея username

Telegram получить id пользователя имея username

как можно получить id пользователя, который не писал в чат боту, и имея только его @username, либо имея его id, который прислал другой пользователь...

133
Ошибка The mbstring extension is missing?

Ошибка The mbstring extension is missing?

Имею на машине LEMP серверПри попытке поставить на него phpmyadmin выдает ошибку

109