PHP Regex найти текст между пользовательскими тегами HTML - PullRequest
16 голосов
/ 30 августа 2010

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

Получил шаблон 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 для получения / замены этого списка?

Спасибо!

Ответы [ 5 ]

39 голосов
/ 30 августа 2010

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

preg_match_all('/<PRODUCT_LIST>(.*?)<\/PRODUCT_LIST>/s', $html, $matches);

//HTML array in $matches[1]
print_r($matches[1]);
9 голосов
/ 30 августа 2010

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

$html = str_get_html($content);
$el = $html->find('PRODUCT_LIST', 0);
$innertext = $el->innertext;
3 голосов
/ 30 августа 2010

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

<?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>');
2 голосов
/ 13 сентября 2014

как указано выше в порядке, но с производительностью действительно ужасно Если вы можете использовать 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

0 голосов
/ 30 августа 2010

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

<PRODUCT_LIST>(.*?)<\/PRODUCT_LIST>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...