2009-10-22 2 views
3

Получая строку с парами атрибут/значение, таких какРазбираем список атрибутов/значений в PHP

attr1="some text" attr2 = "some other text" attr3= "some weird [email protected]'#$\"=+ text" 

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

array('attr1' => 'some text', 
     'attr2' => 'some other text', 
     'attr3' => 'some weird [email protected]\'#$\"=+ text') 

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

+2

Вы не разбираем язык разметки, правильно? –

+0

Хорошо спросить об этом! Нет, просто составляя собственный синтаксис, который легко вводить в командной строке. – dreeves

+2

«быть легким для ввода в командной строке», тогда вас может заинтересовать http://docs.php.net/getopt – VolkerK

ответ

6

попробовать что-то вроде этого:

$text = "attr1=\"some text\" attr2 = \"some other text\" attr3= \"some weird [email protected]'#$\\\"=+ 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 [email protected]'#$\"=+ 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 [email protected]'#$\"=+ text" 
      [1] => attr3 
      [2] => some weird [email protected]'#$\"=+ 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 
+0

Как насчет третьего примера? – Gumbo

+0

Да, я забыл удвоить пробег обратной косой черты (и дважды проверить выход). Боюсь, я иногда слишком уверен в себе. Благодарю. –

+0

Есть ли разница между тем, как php и actionscript, то есть ecmascript/js btw, обрабатывает регулярное выражение? Потому что это регулярное выражение дало только первые два attrs в actionscript. – Amarghosh

2

EDIT: Это регулярное выражение не выполняется, если значение заканчивается обратным наклоном подобные attr4="something\\"

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

var text:String = "attr1=\"some text\" attr2 = \"some other text\" attr3= \"some weird [email protected]'#$\\\"=+ 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 некоторые странно! @ # $ \ "= + текст

+0

Просто маленькая нитьчка: если значение содержит обратную косую черту, например 'attr3 =" \\ "' (которая, вероятно, также потребуется экранирование), она не будет работать с отрицательным Конечно, этого, возможно, никогда не произойдет, ОП не упоминает такие угловые случаи. –

+0

Да, ты прав. И это не nitpick - видимо, это не удается, если строка заканчивается обратным слэшем - например, 'attr4 =" something \\ "' – Amarghosh

Смежные вопросы