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

PHP Regex find text between custom added HTML Tags

提问人:Bathan 提问时间:8/31/2010 最后编辑:Sumit patelBathan 更新时间:8/26/2016 访问量:57861

问:

我有以下场景:

获取将用于 的 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赞 Lèse majesté 8/31/2010
从技术上讲,这不是一个 HTML 标签;这是一个 XHTML 标记。或者,更确切地说,它是 XHTML 文档中的 XML 标记,该文档也使用另一个自定义命名空间。请参见:w3.org/TR/xhtml1/normative.html#well-formed

答:

12赞 webbiedave 8/31/2010 #1

使用简单的 HTML DOM 解析器。它很容易理解和使用。

$html = str_get_html($content);
$el = $html->find('PRODUCT_LIST', 0);
$innertext = $el->innertext;
4赞 shamittomar 8/31/2010 #2

使用此功能。它将以数组形式返回所有找到的值。

<?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赞 ircmaxell 8/31/2010
HTML 不是常规的。像这样的东西适用于提供的简单示例,但它不适用于带有嵌套标签 () 的东西。所以这不是一个好的通用解决方案(没有 -1,因为它确实符合所提供示例的需要)......更好、更通用的解决方案是使用 DOM 解析器(SimpleXML、DomDocument、SimpleHtmlDom 等)......<foo><PRODUCT_LIST><bar><PRODUCT_LIST><baz /></PRODUCT_LIST></bar><buz/></PRODUCT_LIST></foo>
0赞 shamittomar 8/31/2010
@ircmaxell,是的,我同意。但是,由于他指定了自己的标签,因此可能是常规的。只是解决它的另一种方法。
0赞 ircmaxell 8/31/2010
我并不是说它不能做,或者做起来“不好”(否则我会这样做)......我只是说这不是一个通用的解决方案。只要问题范围符合解决方案的限制,就完全可以。我只是指出了局限性(以便更好地评估问题范围)......-1
0赞 shamittomar 8/31/2010
@ircmaxell,是的,我完全同意你的看法。
46赞 MooGoo 8/31/2010 #3

假设<PRODUCT_LIST>标签永远不会嵌套

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

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

评论

1赞 Bathan 8/31/2010
<PRODUCT_LIST>标签永远不会嵌套,但是使用此代码我得到了两个空匹配项......数组(2) { [0]=> 数组(0) {} [1]=> 数组(0) {} }
0赞 MooGoo 8/31/2010
使用您粘贴的 HTML 片段,我得到了一个数组,其中只有一个元素包含 PRODUCT_LIST 标记内的 HTML。也许你应该发布一个更完整的 HTML 示例。
0赞 user435193 8/31/2010 #4

试试这个regular expressionpreg match all function

<PRODUCT_LIST>(.*?)<\/PRODUCT_LIST>
2赞 fearis 9/13/2014 #5

如上所述还可以,但性能真的很糟糕 如果你能使用 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 />';
}
?>

是的,我今天才学会这个。不要在 php5 中使用 preg for HTML