PHP Preg_split分为字符'除了之前?

时间:2015-04-26 18:16:08

标签: php preg-split

我有一个问题是按'字符拆分文字,除非'前面有?

我用这个表达式来分割我的文字:

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

此表达式可以正常工作,但会删除分割字符串中的最后一个字符。

例如,本文:

ONEDAY'TWODAY?'AA'THREEDAY'

返回:

ONEDA
TWODA?0A
THREEDA

2 个答案:

答案 0 :(得分:2)

它以这种方式工作,因为preg_split()使用它匹配的表达式作为分隔符。 您的表达式与撇号(')匹配,后跟任何字符,但?(总共两个字符。)

您需要的是lookbehind assertion

满足您需求的regex是:

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

解释

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

断言与正常字符串进行比较,但不包含在匹配中;这只是背景。

替代

执行相同操作的另一个regex是:

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

它使用一个正的 lookbehind 断言(括在(?<=)中),匹配除问号([^?])之外的任何字符。

答案 1 :(得分:0)

$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