PHP Preg_split 拆分字符 ' 除了前面有?

PHP Preg_split split for character ' except preceded by?

我无法按 ' 个字符拆分文本,除非 ' 前面有 ?

我用这个表达式来拆分我的文本:

preg_split("/([^?]')/",$this->msg)

这个表达式工作正常,但从拆分的字符串中删除了最后一个字符。

例如本文:

ONEDAY'TWODAY?'AA'THREEDAY'

returns:

ONEDA
TWODA?0A
THREEDA

之所以如此,是因为 preg_split() 使用它匹配的表达式作为分隔符。 您的表达式匹配一个撇号 ('),前面有任何字符,但 ?(总共两个字符。)

你需要的是 lookbehind assertion.

满足您需要的 regex 是:

preg_split("/(?<!\?)'/", $this->msg);

说明

包含在(?<!)中的部分是否定的lookbehind断言。它包含转义的问号字符 (?),因为它在 regex 中具有特殊含义,我们需要将其解释为文字问号。否定断言匹配除它包含的表达式之外的任何内容。

像往常一样将断言与主题字符串进行比较,但不包含在匹配中;这只是上下文。

备选

另一个做同样事情的 regex 是:

preg_split("/(?<=[^?])'/", $this->msg);

它使用肯定的 lookbehind 断言(包含在 (?<=) 中)匹配除问号 ([^?] 之外的任何字符).

$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