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
)

Демо-версия:

http://ideone.com/5WMZZQ

Другие вопросы по тегам