Preg Match Subpaterns - Как сопоставить все TD, следующие за строкой - PullRequest
0 голосов
/ 28 ноября 2018
$str = '<tr>
<td>First thing</td>
<td>some stuff <b>150</b></td>
<td>350</td>
<td>250</td>
</tr>
<tr>
<td>Second thing</td>
<td>150</td>
<td>350</td>
<td>250</td>
</tr>';

Идеальный результат:

Найти начало слова «Первый», а затем получить каждую строку внутри следующих ТД, заканчивая ТР и не переходя далее ко второй строке.

Подход:

Я знаю, что мог бы использовать несколько вложенных preg_match_callback ()

Или я мог бы использовать HTML DOM вещь

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

// This is what I have so far...

preg_match_all('~
<td>
(
    (?:
        (?!</td).  # absolutely no idea what this does
    )*
)
</td>
~isx', $str, $m);


print_r($m);

1 Ответ

0 голосов
/ 28 ноября 2018

Хорошо, поэтому я решил это так:

$pos = stripos($str, "First");
$html_TR = substr($str, $pos, stripos($str, '</tr>', $pos));

$pattern = '~ <td> (?: (?!(<td>|</td>)). | (?R) )*+ </td> ~x';

preg_match_all($pattern, $html_TR, $matches);
$html_TDs = $matches[0];

print_r($html_TDs);

Не самое мощное решение, но оно подойдет: (

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

...