为了账号安全,请及时绑定邮箱和手机立即绑定

尝试在 php 中使用正则表达式查找标签并获取属性

尝试在 php 中使用正则表达式查找标签并获取属性

PHP
DIEA 2022-01-24 09:30:19
我在 php 中创建了一个正则表达式来查找 html 行中的标记和属性。它有效,但仅适用于第一个属性而不是重复。以下代码为我提供了第一个属性和值。'@<barcode(\s([a-z]+)="([^"]+)").*/>@m'因此,我添加了加号以使其重复,但它不起作用。'@<barcode(\s([a-z]+)="([^"]+)")+.*/>@m'添加加号后发生的情况是它只选择最后一个属性和值。我只需要一个数组中的所有属性和值,所以我想知道我做错了什么。这是我正在搜索的可能的 html。有时并不总是需要属性,所以我必须考虑到这一点。<barcode type="C128B" height="10" fontsize="0.4" code="testcode" align="L"/><barcode type="Hello"/><barcode type="Hello" code="balls"/><barcode type="C128B" height="10" fontsize="0.7" code="test" align="L"/>我有一个关于 regex101 的示例来查看问题 https://regex101.com/r/jMdA6S/1我们当前的应用程序有效,但只能通过重复以下几行'@<barcode ([a-z]+)="(.*)" ([a-z]+)="(.*)" ([a-z]+)="(.*)" ([a-z]+)="(.*)" ([a-z]+)="(.*)".*/>@m'这意味着每次我添加一个新属性时,我都必须在正则表达式中添加另一个代码块。我试图避免这种情况,因为我们有时必须添加一个新属性来添加不同的功能。
查看完整描述

3 回答

?
慕哥9229398

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


查看完整回答
反对 回复 2022-01-24
?
慕神8447489

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

?>


查看完整回答
反对 回复 2022-01-24
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

您需要/g像这样放在正则表达式的末尾:

<barcode(\s([a-z]+)="([^"]+)").*/g>


查看完整回答
反对 回复 2022-01-24
  • 3 回答
  • 0 关注
  • 275 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信