PHP Preg_split split для символа ', за исключением предшествующего?
У меня проблема с разделением текста по '
характер кроме когда '
предшествует ?
,
Я использовал это выражение, чтобы разделить мой текст:
preg_split("/([^?]')/",$this->msg)
Это выражение работает нормально, но удаляет последний символ из разделенных строк.
Например, для этого текста:
ONEDAY'TWODAY?'AA'THREEDAY'
возвращает:
ONEDA
TWODA?0A
THREEDA
2 ответа
Это работает так, потому что preg_split()
использует выражение, которое соответствует, в качестве разделителя. Ваше выражение соответствует апострофу ('
) предшествует любой символ, кроме ?
(всего два символа)
То, что вам нужно, это утверждение позади.
regex
то, что вам нужно, это:
preg_split("/(?<!\?)'/", $this->msg);
объяснение
Часть, заключенная в (?<!
а также )
является негативным взглядом за утверждением. Содержит знак вопроса (?
) сбежал, потому что это имеет особое значение в regex
и нам нужно, чтобы он был здесь интерпретирован как буквальный знак вопроса. Отрицательное утверждение соответствует чему угодно, кроме выражения, которое оно содержит.
Утверждение сравнивается с предметной строкой, как обычно, но оно не включается в совпадение; это просто контекст.
альтернатива
Другая regex
что делает то же самое:
preg_split("/(?<=[^?])'/", $this->msg);
Он использует позитивное утверждение позади утверждения (заключено в (?<=
а также )
), который соответствует любому символу, кроме знака вопроса ([^?]
).
$string = "ONEDAY'TWODAY?'AA'THREEDAY'";
$parts = preg_split('/\'/sim', $string , -1, PREG_SPLIT_NO_EMPTY);
print_r($parts);
Выход:
Array
(
[0] => ONEDAY
[1] => TWODAY?
[2] => AA
[3] => THREEDAY
)
Демо-версия: