PHP正则表达式在自定义添加的HTML标记之间查找文本

PHP正则表达式在自定义添加的HTML标记之间查找文本,php,regex,Php,Regex,我有以下几种情况: 获取了一个HTML模板文件,该文件将用于邮寄 下面是一个简化的示例: <table> <tr> <td>Heading 1</td> <td>heading 2</td> </tr> <PRODUCT_LIST> <tr> <td>Value 1</td> <td>Value 2</td> </tr>

我有以下几种情况:

获取了一个HTML模板文件,该文件将用于
邮寄

下面是一个简化的示例:

    <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>

标题1
标题2
值1
价值2
我所需要做的就是将HTML代码放入
中,然后重复该代码,重复次数与阵列上的产品相同

<?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正则表达式代码是什么?

谢谢

使用。它易于理解和使用

$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>');
假设
标记永远不会嵌套

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

//HTML array in $matches[1]
print_r($matches[1]);
preg_match_all('/(.*?)/s',$html,$matches);
//$matches中的HTML数组[1]
打印($matches[1]);

preg match all函数中尝试此
正则表达式

<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;
}
?>
loadHTML($html);
}
/***丢弃空白***/
$dom->preserveWhiteSpace=false;
/***通过标记名创建标记***/
$content=$dom->getElementsByTagname($tag);
/***要返回的数组***/
$out=array();
foreach($content as$item)
{
/***将节点值添加到输出数组***/
$out[]=$item->nodeValue;
}
/***返回结果***/
退回$out;
}
?>
添加此函数后,您可以将其用作:

$content = getTextBetweenTags('PRODUCT_LIST', $your_html);

foreach( $content as $item )
{
    echo $item.'<br />';
}
?>
$content=getTextBetweenTags('PRODUCT\u LIST',$your\u html);
foreach($content as$item)
{
回显$item.“
”; } ?>

是的,我今天才知道。不要将preg用于带有php5的html

html不是规则的。类似这样的内容适用于提供的简单示例,但不适用于带有嵌套标记的内容(
)。因此,它不是一个好的通用解决方案(no-1,因为它确实符合所提供示例的需要)。。。更好、更通用的解决方案是使用DOM解析器(SimpleXML、DomDocument、SimpleHtmlDom等)…@ircmaxell,是的,我同意。但是,由于他正在指定自己的标签,它可能是常规的。这只是解决问题的另一种方法。我并不是说这件事做不到或做起来“不好”(否则我会有
-1
)。。。我只是说这不是一个通用的解决方案。只要问题范围在解决方案的限制范围内,就完全可以。我只是指出了局限性(以便更好地评估问题范围)…@ircmaxell,是的,我完全同意你的看法。标记永远不会嵌套,但使用此代码我得到两个空匹配项。。。array(2){[0]=>array(0){}[1]=>array(0){}}使用您粘贴的HTML片段,我得到一个数组,其中只有一个元素包含PRODUCT_列表标记中的HTML。也许你应该发布一个更完整的HTML示例;这是一个XHTML标记。或者,更确切地说,它是XHTML文档中的一个XML标记,也使用另一个自定义名称空间。见: