Just123i
@Just123i

Как правильно составить регулярку (php, preg_grep)?

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

Суть вот в чем, есть html страница с текстовым содержимым, пример:

<tr>
    <th> Цвет</th>					
    <td>Синий</td>
</tr>
<tr>
    <th> Цвет кузова</th>					
    <td>Черный</td>
</tr>
<tr>
    <th> Цвет салона</th>					
    <td>Бежевый</td>
</tr>

Причем страниц много и где-то все цвета прописаны, где-то только цвет кузова, где-то цвет салон только, в общем везде по разному. Я пытаюсь спарсить это следующим образом:

$test_color_k = array_values(preg_grep('#Цвет кузова#', $test));
@$color_k[] = trim(str_replace('Цвет кузова', '', $test_color_k[0]));


$test_color_a = array_values(preg_grep('#Цвет#', $test));
@$color_a[] = trim(str_replace('Цвет', '', $test_color_a[0]));


Проблема вот в чем, никак не могу написать регулярку, которая бы вытаскивала только "Цвет", пробовал по всякому, никак не получается, все время цепляет первый попавший элемент, даже если там не "Цвет Черный", а "Цвет кузова Черный".
Просьба знающих людей помочь с решением проблемы.

Спасибо!
  • Вопрос задан
  • 165 просмотров
Пригласить эксперта
Ответы на вопрос 2
e_svirsky
@e_svirsky
Web Developer
Для данной задачи неплохо бы подошёл Symfony Crawler.
Скармливаете ему HTML и потом по нодам аналогично jQuery лазите. Будет очень удобно. Не уверен что тут регуляркой получится обойтись, но может кто сможет помочь.
Я бы заюзал краулер. Подключается как независимый компонент через composer к любому проекту.
Ответ написан
Комментировать
@maikttt
$str = <<<TEXT
<tr>
    <th> Цвет</th>					
    <td>Синий</td>
</tr>
<tr>
    <th> Цвет кузова</th>					
    <td>Черный</td>
</tr>
<tr>
    <th> Цвет салона</th>					
    <td>Бежевый</td>
</tr>
TEXT;

$m = preg_match_all('#<tr>(?:[\s\n]*)<th>(.*?)<\/th>(?:[\s\n]*)<td>(.*?)</td>(?:[\s\n]*)</tr>#', $str, $match);
$ret = [];
if ($m) {
    foreach ($match[1] as $i => $k) {
    	$ret[$k] = $match[2][$i];
    }
}

var_export($ret);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы