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