У меня он следующий сценарий:
Получил файл шаблона 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>