3 回答
TA贡献1877条经验 获得超6个赞
好吧,即使有一些很好的答案,也没有人能告诉我是否有办法在一个正则表达式中做到这一点,这就是我的问题。但是我不得不屈服并在两个正则表达式中做到这一点。我试图避免两个正则表达式,因为我认为加号应该重复中间部分。
第一个正则表达式找到标签,我有一个 getAttributes 函数来获取属性。然后 getAttributes 函数将每个函数放入一个平面数组中供我处理。我给出了一个答案,但即使这个答案也没有真正回答我关于如何在一个正则表达式中做到这一点的问题。但是,我会发布我所做的工作,以防它对其他人有所帮助。
Amessihel 和 Maciej Król 都给出了很好的建议,如果这是一个正在建设的新项目,我可能会接受这个建议。但是,我使用了以下代码。
<?php
$str = '<barcode type="C128B" height="10" fontsize="0.4" code="pdfbarcode_content" align="L"/>
<barcode href="Hello"/>
<barcode href="Hello" type="balls"/>
<barcode type="C128B" height="10" fontsize="0.4"/>
<barcode type="C128B" height="10" fontsize="0.4" code="test" align="L"/>';
function getAttributes($attr){
preg_match_all('@(?:([a-z]+)="([^"]+)")+@m', $attr, $matches,PREG_SET_ORDER);
$rArray=[];
foreach($matches as $line):
array_push($rArray,$line[1]);
array_push($rArray,$line[2]);
endforeach;
return $rArray;
}
function barcode($file){
return preg_replace_callback(
'@<barcode(.*)/>@m',
function($matches) {
echo '<pre>'.print_r($matches[1],1).'</pre>';
echo '<pre>'.print_r(getAttributes($matches[1]),1).'</pre>';
echo "-----------------------";
//Here is where I process the array
return '';
},
$file);
}
barcode($str);
TA贡献1780条经验 获得超1个赞
一个好的做法是使用相关的操作工具解析 HTML 内容。对于您的问题,您可以在读取文件时解析(SAX 方法),或者一次加载文件然后访问其内容(DOM 方法)。
这是一种执行您需要的方法。如果不需要保留全部内容,我喜欢使用 SAX 方式(广泛基于PHP 官网的XML Element Structure Example ):
<?php
$file = "data.html"; // your file
$depth = array();
function startElement($parser, $tagname, $attrs)
{
// For each tag encountered
// - $tagname contains the name
// - $attrs is an associative array name -> value of the attributes
// Add the code below the code to deal with it:
echo "<pre>\n";
echo "Tags : $tagname\n";
echo "Attributes:\n";
print_r($attrs);
echo "</pre>\n";
}
// Create the parser
$xml_parser = xml_parser_create();
// Set element handles for the parser (we just need start element handler,
// so the end element is set as FALSE
xml_set_element_handler($xml_parser, "startElement", FALSE);
// Open your file
if (!($fp = fopen($file, "r"))) {
die("Oops.");
}
// Loop reading and parsing the file
while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die("Oops.");
}
}
// Done. Free your parser.
xml_parser_free($xml_parser);
?>
- 3 回答
- 0 关注
- 275 浏览
添加回答
举报