如何使用Regex爆炸序列化字符串内的字符串

时间:2014-12-24 07:01:31

标签: php regex serialization

我有一些字符串,并包含序列化数据。

示例

{waku:community id=1} just published an event {waku:event id=9 type=story}

实施

        preg_match_all('/\{(waku:[^}]+)\}/', $str, $matches);
        foreach ($matches[1] as $i => $elem) {
            $prop = explode('&', preg_replace('/\s+/', '&', $elem));
            $type = substr(array_shift($prop), strlen('waku:'));
            var_dump($prop);
        }

此代码不起作用,

输出

    array(1) {
  [0]=>
  string(4) "id=1"
}

array(2) {
  [0]=>
  string(4) "id=9"
  [1]=>
  string(10) "type=story"
}

如何爆炸该字符串以获取 waku:type(社区/活动)的类型以及 id

我希望你能解决这个问题。

由于

3 个答案:

答案 0 :(得分:2)

如果每个waku元素都有类型 id ,您可以在正则表达式中识别它们:

preg_match_all('/\{waku:(\w+)\s+id=(\d+)\s*([^}]*)\}/', $str, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
    $type = $match[1];
    $id = $match[2];
    $otherParameters = $match[3];
}

答案 1 :(得分:0)

您可以使用:

$str = '{waku:community id=1} just published an event {waku:event id=9 type=story}';
$arr = array();
preg_replace_callback('~\{\s*waku:(?:community|event)\s*(.+?)\}~s',
    function ($m) use (&$arr) { if (preg_match_all('~[^=\s]+=[^\s=]+~', $m[1], $w))
        $arr[] = $w[0]; }, $str);
print_r($arr);

<强>输出:

Array
(
    [0] => Array
        (
            [0] => id=1
        )

    [1] => Array
        (
            [0] => id=9
            [1] => type=story
        )

)

答案 2 :(得分:0)

{waku:\S+\s(id=\d+)\s*(type=[^}]+)?}

试试这个。看看演示。

https://regex101.com/r/gQ3kS4/8

$re = "/{waku:\\S+\\s(id=\\d+)\\s*(type=[^}]+)?}/";
$str = "{waku:community id=1} just published an event {waku:event id=9 type=story}";

preg_match_all($re, $str, $matches);