提问人:Bathan 提问时间:8/31/2010 最后编辑:Sumit patelBathan 更新时间:8/26/2016 访问量:57861
PHP 正则表达式在自定义添加的 HTML 标记之间查找文本
PHP Regex find text between custom added HTML Tags
问:
我有以下场景:
获取将用于 的 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 正则表达式代码是什么?
谢谢!
答:
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 expression
preg 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
评论