Ответ 1
Предполагая, что теги <PRODUCT_LIST>
никогда не будут вложенными
preg_match_all('/<PRODUCT_LIST>(.*?)<\/PRODUCT_LIST>/s', $html, $matches);
//HTML array in $matches[1]
print_r($matches[1]);
У меня есть следующий сценарий:
Получен шаблон 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 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 />';
}
?>
yep, я просто узнаю об этом сегодня. Не используйте preg для html с php5
попробуйте regular expression
в preg match all function
<PRODUCT_LIST>(.*?)<\/PRODUCT_LIST>