Regex экранировать определенные символы - PullRequest
1 голос
/ 29 июня 2011

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

Пример:

// 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'
);

Ответы [ 3 ]

3 голосов
/ 30 июня 2011

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

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

Исходный ответ (который не относится к проблеме ОП):

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

(?<!\\)\*
2 голосов
/ 30 июня 2011

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

$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"
}
2 голосов
/ 30 июня 2011

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

...