我在php中使用preg_match_all来构造写在DSL中的字符串的标记。当我将测试字符串硬编码到我的PHP代码中并运行它时,它都可以工作。但是,当我从数据库中读取相同的字符串时,它会匹配前两个标记,然后将其余的字符串匹配为一个标记,当清楚地将其拆分为多个子单元时,就像字符串被硬编码时一样。php中的preg_match_all产生与数据库字符串不同的结果
这怎么可能?
我正在使用。+在我的正则表达式中匹配“其余”。基本上我的DSL包括关键字和休息,所以我对preg_match_all正则表达式如下:
/(?P<NameOfKeyword1>Keyword1)|(?P<NameOfKeyword2>Keyword2)|(?P<NameOfKeyword3>Keyword3)|(?P<Linebreak>\\v+)|(?P<Rest>.+(?=Keyword1)|.+(?=Keyword2)|.+(?=Keyword3)|.+)/
基本上,我的第一场比赛的关键词,然后我匹配换行符,那么剩下的,直到下一个关键字(或断行或结束的字符串)出现。
那么为什么它在字符串硬编码时正确匹配,但是当从数据库中读取相同的字符串时不能正确匹配?
当从数据库中读取匹配为一个标记的字符串的其余部分时,不应该将其作为一个标记进行匹配,因为它们之间有关键字。它看起来像它匹配它基于+
编辑: 我使用的preg_match_all的标志是PREG_SET_ORDER和PREG_OFFSET_CAPTURE
也许字符编码问题? – Barmar 2013-04-23 07:37:57
可能,我该如何检查? – user975561 2013-04-23 08:07:36
从数据库中读取字符串,然后将其与硬编码字符串进行比较。 – Barmar 2013-04-23 08:27:27