0

我将在 HTML 中嵌入代码,它看起来像这样:

<div id="someDiv">
{:
    HTMLObject
    id: form
    background: blue
    font: large
    fields [
        username: usr
        password: pwd
    ]

    foo: bar
:}
</div>

我正在尝试编写一个正则表达式,它将采用这些 HTMLObjects 并将它们分解为可管理的数组。我已经有了正则表达式,它将执行诸如

id: form

但是,我无法使正则表达式也匹配像

fields [
    username: usr
    password: pwd
]

这是我执行这些任务的功能:

function parseHTMLObjects($html) {
    $details = preg_replace('/[{:]([^}]+):}/i', '$1', $html);
    $details = trim(str_replace('HTMLObject', '', $details));

    $dynamPattern = '/([^\[]+)\[([^\]]+)]/';
    $dynamMatch = preg_match_all($dynamPattern, $details, $dynamMatches);

    print_r($dynamMatches); // nothing is shown here

    $findMatch = preg_match_all('/([^:]+):([^\n]+)/', $details, $matches);

    $obs = array();
    foreach($matches[0] as $o) {
        $tmp = trim($o);
        echo $tmp . "\n";
    }
}

当我像在页面开头演示的那样传递一个 HTML 字符串时,正则$findMatch表达式工作正常,但没有任何内容存储在 dynams 中。我会以错误的方式解决这个问题吗?

基本上我所需要的只是将每个对象存储在一个数组中,因此从上面的示例 HTML 字符串来看,这将是一个理想的数组:

Array() {
    [0] => id: form
    [1] => background: blue
    [2] => font: large
    [3] => fields [
               username: usr
               password: pwd
           ]
    [4] => foo: bar
}

我已经处理了超出该点的所有排序和操作,但就像我说的那样,我无法获得处理冒号样式对象的相同正则表达式也处理括号样式对象。

如果我需要使用不同的正则表达式并将结果存储在不同的数组中也可以。

4

2 回答 2

1

它可以很容易地用一些名为 YAML 或 JSON 的黑色魔法来制作,语法如下:

YAML

{:
    HTMLObject:
      id: form
      background: blue
      font: large
      fields: [
        username: usr,
        password: pwd
      ]
      foo: bar
:}

JSON

{:
    { 
      "HTMLObject":{
        "id": "form",
        "background": "blue",
        "font": "large",
        "fields": [
          {"usernamd": "usr"},
          {"password": "pwd"}
        ],
        "foo": "bar"
      }
    }
:}

不-不-但是为什么?因为它是本地解析的。没有脏的正则表达式。

于 2013-05-25T06:34:03.297 回答
0

我还不能对帖子发表评论,但绝对是寻找从一种符号到 php 数组的转换函数是前进的方向,json_decode 就是其中之一,尽管您的数据正在以其他方式开始生命。

正则表达式对于通常很复杂的复杂数据可能非常棘手,因为它具有一些其他结构,可以用其他工具更好地解释

PS如果你在任何时候在php中使用json_decode,不要被第二个参数抓住——它需要设置为'true'才能得到一个数组!

于 2013-05-25T06:36:47.637 回答