Разобрать список атрибутов / значений в PHP - PullRequest
3 голосов
/ 22 октября 2009

Задана строка с парами атрибут / значение, например

attr1="some text" attr2 = "some other text" attr3= "some weird !@'#$\"=+ text"

цель состоит в том, чтобы проанализировать его и вывести ассоциативный массив, в этом случае:

array('attr1' => 'some text',
      'attr2' => 'some other text',
      'attr3' => 'some weird !@\'#$\"=+ text')

Обратите внимание на непоследовательный интервал вокруг знаков равенства, экранированную двойную кавычку на входе и экранированную одинарную кавычку на выходе.

Ответы [ 2 ]

6 голосов
/ 22 октября 2009

Попробуйте что-то вроде этого:

$text = "attr1=\"some text\" attr2 = \"some other text\" attr3= \"some weird !@'#$\\\"=+ text\"";
echo $text;
preg_match_all('/(\S+)\s*=\s*"((?:\\\\.|[^\\"])*)"/', $text, $matches, PREG_SET_ORDER);
print_r($matches);

, который производит:

attr1="some text" attr2 = "some other text" attr3= "some weird !@'#$\"=+ text"

Array
(
    [0] => Array
        (
            [0] => attr1="some text"
            [1] => attr1
            [2] => some text
        )

    [1] => Array
        (
            [0] => attr2 = "some other text"
            [1] => attr2
            [2] => some other text
        )

    [2] => Array
        (
            [0] => attr3= "some weird !@'#$\"=+ text"
            [1] => attr3
            [2] => some weird !@'#$\"=+ text
        )

)

И краткое объяснение:

(\S+)               // match one or more characters other than white space characters
                    // > and store it in group 1
\s*=\s*             // match a '=' surrounded by zero or more white space characters 
"                   // match a double quote
(                   // open group 2
  (?:\\\\.|[^\\"])* //   match zero or more sub strings that are either a backslash
                    //   > followed by any character, or any character other than a
                    //   > backslash
)                   // close group 2
"                   // match a double quote
2 голосов
/ 22 октября 2009

РЕДАКТИРОВАТЬ: это регулярное выражение не выполняется, если значение заканчивается обратной косой чертой, как attr4="something\\"

Я не знаю PHP, но поскольку регулярное выражение было бы практически одинаковым на любом языке, я сделал это в ActionScript:

var text:String = "attr1=\"some text\" attr2 = \"some other text\" attr3= \"some weird !@'#$\\\"=+ text\"";

var regex:RegExp = /\s*(\w+)\s*=\s*(?:"(.*?)(?<!\\)")\s*/g;

var result:Object;
while(result = regex.exec(text))
    trace(result[1] + " is " + result[2]);

И я получил следующее:

attr1 - это некоторый текст
attr2 - это другой текст
attr3 - это что-то странное! @ '# $ \ "= + text

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...