2010-08-30 2 views
14

я ему следующий сценарием: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-код PHP для получения/замены этого списка?

Спасибо!

+1

Технически это не тег HTML; это тег XHTML. Или, скорее, это XML-тег в документе XHTML, который также использует другое настраиваемое пространство имен. См .: http://www.w3.org/TR/xhtml1/normative.html#well-formed –

ответ

30

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

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

//HTML array in $matches[1] 
print_r($matches[1]); 
+0

теги никогда не будут вложенными, но с использованием этого кода я получаю два пустых совпадения ... массив (2) { [0] => массив (0) {} [1] => массив (0) {} } – Bathan

+0

С помощью фрагмента HTML, который вы вставили, я получаю массив с одним элементом, содержащим HTML внутри тегов PRODUCT_LIST. Возможно, вам следует опубликовать более полный образец HTML. – MooGoo

+0

Спасибо, чувак! У меня была опечатка на HTML.Это работает просто отлично – Bathan

3

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

<?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>'); 
+1

HTML не является регулярным. Что-то, как это будет работать на простом примере, при условии, но он не будет работать на что-то с вложенными тегами (''). Таким образом, это не очень хорошее общее решение (нет -1, поскольку оно соответствует потребностям приведенного примера). Лучшим и более общим решением было бы использовать парсер DOM (SimpleXML, DomDocument, SimpleHtmlDom и т. Д.) ... – ircmaxell

+0

@ircmaxell, да, я согласен. Но поскольку он задает свои ** собственные ** теги, это может быть регулярным. Это еще один способ решить эту проблему. – shamittomar

+0

Я не говорю, что это невозможно, или это «плохо» (иначе я бы «-1») ... Я просто говорю, что это не общее решение. Это совершенно нормально, пока область проблем соответствует ограничениям решения. Я просто указывал на ограничения (так что проблема может быть лучше оценена) ... – ircmaxell

0

попробовать это regular expression в preg match all function

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

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

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

Смежные вопросы