PHP Regex находит текст между настраиваемыми добавленными тегами HTML

У меня он следующий сценарий:

Получил файл шаблона HTML, который будет использоваться для mailing .

Ниже приведен пример:

  <table> <tr> <td>Heading 1</td> <td>heading 2</td> </tr> <PRODUCT_LIST> <tr> <td>Value 1</td> <td>Value 2</td> </tr> </PRODUCT_LIST> </table> 

Все, что мне нужно сделать, это получить код HTML внутри <PRODUCT_LIST> а затем повторить этот код столько раз, сколько продуктов, которые у меня есть на массиве.

Каким будет правильный код PHP Regex для получения / замены этого списка?

Благодаря!

Предполагая, что теги <PRODUCT_LIST> никогда не будут вложенными

 preg_match_all('/<PRODUCT_LIST>(.*?)<\/PRODUCT_LIST>/s', $html, $matches); //HTML array in $matches[1] print_r($matches[1]); 

Используйте простой HTML DOM Parser . Его легко понять и использовать.

 $html = str_get_html($content); $el = $html->find('PRODUCT_LIST', 0); $innertext = $el->innertext; 

Используйте эту функцию. Он вернет все найденные значения в виде массива.

 <?php function get_all_string_between($string, $start, $end) { $result = array(); $string = " ".$string; $offset = 0; while(true) { $ini = strpos($string,$start,$offset); if ($ini == 0) break; $ini += strlen($start); $len = strpos($string,$end,$ini) - $ini; $result[] = substr($string,$ini,$len); $offset = $ini+$len; } return $result; } $result = get_all_string_between($input_string, '<PRODUCT_LIST>', '</PRODUCT_LIST>'); в <?php function get_all_string_between($string, $start, $end) { $result = array(); $string = " ".$string; $offset = 0; while(true) { $ini = strpos($string,$start,$offset); if ($ini == 0) break; $ini += strlen($start); $len = strpos($string,$end,$ini) - $ini; $result[] = substr($string,$ini,$len); $offset = $ini+$len; } return $result; } $result = get_all_string_between($input_string, '<PRODUCT_LIST>', '</PRODUCT_LIST>'); 

как указано выше, хорошо, но с эффективностью действительно ужасно. Если вы можете использовать PHP 5, вы можете использовать объект DOM следующим образом:

  <?php function getTextBetweenTags($tag, $html, $strict=0) { /*** a new dom object ***/ $dom = new domDocument; /*** load the html into the object ***/ if($strict==1) { $dom->loadXML($html); } else { $dom->loadHTML($html); } /*** discard white space ***/ $dom->preserveWhiteSpace = false; /*** the tag by its tag name ***/ $content = $dom->getElementsByTagname($tag); /*** the array to return ***/ $out = array(); foreach ($content as $item) { /*** add node value to the out array ***/ $out[] = $item->nodeValue; } /*** return the results ***/ return $out; } ?> 

и после добавления этой функции вы можете просто использовать ее как:

 $content = getTextBetweenTags('PRODUCT_LIST', $your_html); foreach( $content as $item ) { echo $item.'<br />'; } ?> 

да, я просто узнаю об этом сегодня. Не использовать preg для html с php5

попробуйте это regular expression в preg match all function

 <PRODUCT_LIST>(.*?)<\/PRODUCT_LIST>