PHP Preg_split 分割字符 ' except 前面的? [重复]

问题描述 投票:0回答:2

我在按

'
字符拆分文本时遇到问题,除非
'
前面有
?

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

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

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

例如本文:

ONEDAY'TWODAY?'AA'THREEDAY'

返回:

ONEDA
TWODA?0A
THREEDA
php preg-split
2个回答
2
投票

它以这种方式工作,因为

preg_split()
使用它匹配的表达式作为分隔符。 您的表达式与撇号 (
'
) 匹配,其前面可以是除
?
之外的任何字符(总共两个字符。)

你需要的是一个 lookbehind 断言

A

regex
满足您的需求是:

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

说明

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

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

替代方案

另一个做同样事情的

regex
是:

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

它使用正向 lookbehind 断言(包含在

(?<=
)
中)匹配除问号 (
[^?]
) 之外的任何字符。


0
投票
$string = "ONEDAY'TWODAY?'AA'THREEDAY'";
$parts = preg_split('/\'/', $string , -1, PREG_SPLIT_NO_EMPTY);
print_r($parts);

输出:

Array
(
    [0] => ONEDAY
    [1] => TWODAY?
    [2] => AA
    [3] => THREEDAY
)

演示:

http://ideone.com/5WMZZQ

© www.soinside.com 2019 - 2024. All rights reserved.