php найти строку, содержащую ключевое слово и получить строку между тегами


У меня была строка, содержащая HTML-теги, и я хочу получить всю строку, между которой содержится ключевое слово "GB".

Иногда в <td> есть разные атрибуты класса или стиля, а также могут быть разные возможности между тегами, поэтому я думал найти "GB" или "gb", а затем получить целую строку между ">" и "<"... но только понятия не имею как...

Пример моей строки, как показано ниже:

$str='<tr>
    <td class="table_title13_bg_gray_line" width="171" align="left">Capacity</td>
    <td class="table_line_x_h10" width="647" align="left">&nbsp;16GB/32GB/64GB/128GB</td>
</tr>';

Из строки выше, я хотел бы чтобы получить строку "16GB/32GB/64GB/128GB" Может ли кто-нибудь дать мне знать, что я должен делать?

Править: И говорит, что если есть какие-то теги в "16GB/32GB/64GB/128GB",

Исх. <td class="table_line_x_h10" width="647" align="left">&nbsp;16GB/<span style="color:red;">32GB</span>/64GB<br/>128GB</td>

Похоже, что шаблон $pattern = "/<td ?.*>(.*?)</td>/"; не будет работать, так что же еще я могу сделать?

2 2

2 ответа:

Просто попробовал и решил этот вопрос самостоятельно... ответьте здесь и надейтесь, что это будет полезно для кого-то еще.

$pattern = "/<td ?.*>(.*)<\/td>/";
preg_match_all($pattern, $str, $matches);
foreach( $matches[0] as $key=>$val){ 
    if(preg_match('/GB/i',$val)){
        echo $val;
    }
}
//output: 16GB/32GB/64GB/128GB
Но все же интересно, есть ли лучший или более простой способ?

Отредактировано:

Ладно, я понял... я действительно ненавижу регулярные выражения...

$pattern = '/[<td ?.*>](.*?)<\/td>/s';

Это может решить случай, если строка между тегами td содержит другие теги... просто простой []...

Как насчет использования preg_match_all:

$str='<td class="table_line_x_h10" width="647" align="left">&nbsp;16GB/<span style="color:red;">32GB</span>/64GB<br/>128GB</td>';
preg_match_all('/(\d+GB)/i', $str, $m);
print_r($m);                                                          

Вывод:

Array
(
    [0] => Array
        (
            [0] => 16GB
            [1] => 32GB
            [2] => 64GB
            [3] => 128GB
        )

    [1] => Array
        (
            [0] => 16GB
            [1] => 32GB
            [2] => 64GB
            [3] => 128GB
        )

)