Разбор атрибутов в PHP с использованием регулярных выражений - PullRequest
1 голос
/ 05 ноября 2011

Считайте, что у меня есть строка,

$string = 'tag2 display="users" limit="5"';

Используя функцию preg_match_all, мне нужно получить вывод

Требуется o / p

Array
(
    [0] => Array
        (
            [0] => tag2
            [1] => tag2
            [2] => 
        )

    [1] => Array
        (
            [0] => display="users"
            [1] => display
            [2] => users
        )

    [2] => Array
        (
            [0] => limit="5"
            [1] => limit
            [2] => 5
        )

)

Я попытался использовать этот шаблон '/([^=\s]+)="([^"]+)"/', но он не распознает параметр без значения (в данном случае tag2 ). Вместо этого он выдает

Что я получаю

Array
(
    [0] => Array
        (
            [0] => display="users"
            [1] => display
            [2] => users
        )

    [1] => Array
        (
            [0] => limit="5"
            [1] => limit
            [2] => 5
        )

)

Каким будет шаблон для получения требуемого результата?

РЕДАКТИРОВАТЬ 1: Мне также нужно получить атрибуты, которые не заключены в кавычки, например: attr=val.Извините, что не упомянул раньше.

Ответы [ 3 ]

2 голосов
/ 05 ноября 2011

Попробуйте это:

<?php

    $string = 'tag2 display="users" limit="5"';
    preg_match_all('/([^=\s]+)(="([^"]+)")?/', $string, $res);

    foreach ($res[0] as $r => $v) {
        $o[] = array($res[0][$r], $res[1][$r], $res[3][$r]);
    }

    print_r($o);

?>

Это выводит меня:

Array
(
    [0] => Array
        (
            [0] => tag2
            [1] => tag2
            [2] => 
        )

    [1] => Array
        (
            [0] => display="users"
            [1] => display
            [2] => users
        )

    [2] => Array
        (
            [0] => limit="5"
            [1] => limit
            [2] => 5
        )

)
1 голос
/ 05 ноября 2011

Я думаю, что не вполне возможно дать вам одним вызовом то, что вы ищете, но это довольно близко:

$string = 'tag2 display="users" limit=5';
preg_match_all('/([^=\s]+)(?:="?([^"]+)"?|())?/', $string, $res, PREG_SET_ORDER);
print_r($res);

Вывод:

Array
(
    [0] => Array
        (
            [0] => tag2
            [1] => tag2
            [2] => 
            [3] => 
        )

    [1] => Array
        (
            [0] => display="users"
            [1] => display
            [2] => users
        )

    [2] => Array
        (
            [0] => limit=5
            [1] => limit
            [2] => 5
        )

)

Как выКак видите, первый элемент не имеет значения, я попытался обойти это и предложил пустое совпадение.Таким образом, это строит массив, который вы запрашивали, но имеет дополнительную запись в пустом атрибуте.

Однако основной точкой является флаг PREG_SET_ORDER preg_match_all.Может быть, вы уже можете жить с этим выводом.

0 голосов
/ 05 ноября 2011

Может быть, вы заинтересованы в этом небольшом фрагменте , который анализирует все виды стилей атрибутов.<div class="hello" id=foobar style='display:none'> действительно html (5), не очень, я знаю ...

<?php
$string = '<tag2 display="users" limit="5">';

$attributes = array();
$pattern = "/\s+(?<name>[a-z0-9-]+)=(((?<quotes>['\"])(?<value>.*?)\k<quotes>)|(?<value2>[^'\" ]+))/i";
preg_match_all($pattern, $source, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
  $attributes[$match['name']] = $match['value'] ?: $match['value2'];
}

var_dump($attributes);

даст вам

$attributes = array(
  'display' => 'users',
  'limit' => '5',
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...