2011-06-29 5 views
1

Я использую preg_split для создания массива с некоторыми значениями. Если у меня есть значение, такое как «Это значение», preg_split разделит значение на массив («Это», «Значение») из-за * в значении, но я хочу разбить его на то, где я указал, а не на * из значения. Как можно избежать значения, поэтому символы строки не влияют на выражение?Выражение специальных символов Regex

Пример:

// Cut into {$1:$2} 
$str = "{Some:Value*Here}"; 
$result = preg_split("/[\{(.*)\:(.*)\}]+/", $str, -1, PREG_SPLIT_NO_EMPTY); 

// Result: 

Array(
    'Some', 
    'Value', 
    'Here' 
); 

// Results wanted: 

Array(
    'Some', 
    'Value*Here' 
); 
+0

Можете ли вы быть более конкретным? Какая строка и на что вы хотите разбить ее? –

+0

Просто не используйте '*' в вашем регулярном выражении split? Или вы хотите использовать '*' в качестве разделителя, но также разрешить его внутри отдельных значений внутри строки? –

+0

Да, Марк Б. Я хочу разбить на *, но также использовать его в значении, не разделяя значения. –

ответ

2

Ваше текущее регулярное выражение немного ... дикое. Большинство специальных символов внутри класса символов рассматриваются буквально, поэтому он может быть значительно упрощена:

$str = "{Some:Value*Here}"; 
$result = preg_split("/[{}:]+/", $str, -1, PREG_SPLIT_NO_EMPTY); 

А теперь $result выглядит следующим образом:

array(2) { 
    [0] => string(4) "Some" 
    [1] => string(10) "Value*Here" 
} 
3

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

"/(\{([^:]*)\:([^:]*)\})+/" 

Оригинальный ответ (который не относится к проблеме операционного в):

Если вы хотите, чтобы избежать * в ваши ценности с \ как this\*value, вы можете разделить на этом регулярное выражение:

(?<!\\)\* 
+0

Это не работает. Вот ваш код '$ str = '{test}: {asd} {asd}: {12 * 3}'; эхо "

"; preg_match("/(\{(.*)\}\:\{(.*)\})+/", $str, $matches); print_r($matches); echo "
"; ' Результат: ' Массив ( [0] => {испытание}: {ASD} {ASD}: {12 * 3} [1] => {испытание}: {ASD } {asd}: {12 * 3} [2] => test}: {asd} {asd [3] => 12 * 3 ) ' –

2

Правильное и безопасное решение вашей проблемы - использовать preg_quote. Если строка содержит символы, которые не должны указываться, вам нужно вернуть str_replace после цитирования.

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