2015-02-19 2 views
0

Если у меня есть строка, как это:php: скобки/содержимое из массива?

$str = '[tr]Kapadokya[/tr][en]Cappadocia[/en][de]Test[/de]'; 

Я хочу, что

$array = array(
'tr' => 'Kapadokya', 
'en' => 'Cappadocia', 
'de' => 'Test'); 

Как мне это сделать?

+0

Пожалуйста, имейте в виду, что SO-сообщество в целом любит, чтобы увидеть немного больше усилий, прежде чем задавать вопрос: Что вы пытаетесь решать проблему? Проводили ли вы фундаментальные исследования? .... – VolkerK

ответ

2

С некоторыми предположениями о фактическом синтаксисе вашей строки BBCode-ish может быть достаточно (pc) regular expression.

<?php 
$str = '[tr]Kapadokya[/tr][en]Cappadocia[/en][de]Test[/de]'; 

$pattern = '! 
    \[ 
     ([^\]]+) 
    \] 
    (.+) 
    \[ 
    /
     \\1 
    \] 
!x'; 

/* alternative, probably better expression (see comments) 
$pattern = '! 
    \[   (?# pattern start with a literal [) 
     ([^\]]+) (?# is followed by one or more characters other than ] - those characters are grouped as subcapture #1, see below) 
    \]   (?# is followed by one literal ]) 
    (   (?# capture all following characters) 
     [^[]+  (?# as long as not a literal ] is encountered - there must be at least one such character) 
    ) 
    \[   (?# pattern ends with a literal [ and) 
    /   (?# literal /) 
     \1   (?# the same characters as between the opening [...] - that's subcapture #1 ) 
    \]   (?# and finally a literal ]) 
!x';  // the x modifier allows us to make the pattern easier to read because literal white spaces are ignored 
*/ 

preg_match_all($pattern, $str, $matches); 
var_export($matches); 

печатает

array (
    0 => 
    array (
    0 => '[tr]Kapadokya[/tr]', 
    1 => '[en]Cappadocia[/en]', 
    2 => '[de]Test[/de]', 
), 
    1 => 
    array (
    0 => 'tr', 
    1 => 'en', 
    2 => 'de', 
), 
    2 => 
    array (
    0 => 'Kapadokya', 
    1 => 'Cappadocia', 
    2 => 'Test', 
), 
) 

Смотри также: http://docs.php.net/pcre

+0

Нет необходимости удваивать escape-обратную связь, и вы должны изменить '. +' На '[^ [] +' или по крайней мере '. +?', Чтобы ограничить обратную трассировку (и если несколько переводов находятся на той же линии). –

+0

a) да, возможно; Я никогда бы этого не сделал, потому что меня поднял C-разработчик, где он был (в те дни, * sigh *: D) ошибка. Но ты прав. б) нет, я не хочу; это свобода, которую я вложил в «несколько предположений» ;-) Но да, используя '[^ [] +' can_easily_, можно считать лучше. – VolkerK

+0

У нас действительно мало информации о точном синтаксисе этого bbcode-подобного, но он, кажется, является последовательными переводами одного и того же термина, поэтому я предположил, что мой тег не может содержать вложенные теги, но будущее дверь все возможное. –

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