我举起这段文字:
II - title - XXXXXXXX
CNPJ: XXXXXXXXXX
test1: XXXXXXXXXX
Test1: XXXXXXXXXX
IIX - XXXXXXXX
CNPJ: XXXXXXXXXX
test2: XXXXXXXXXX
Test2: XXXXXXXXXX
我需要这个:
array(
0 => '
II - title - XXXXXXXX
CNPJ: XXXXXXXXXX
test1: XXXXXXXXXX
Test1: XXXXXXXXXX
',
1 => '
IIX - XXXXXXXX
CNPJ: XXXXXXXXXX
test2: XXXXXXXXXX
Test2: XXXXXXXXXX
',
)
我用PHP代码填充这个正则表达式:
$regex = '~((?<delimiter>((.*\n{1}CNPJ)+).*?(?=(?&delimiter)|\Z)))~s';
preg_match_all($regex, $text, $matches);
单独的正则表达式工作:
(.*\n{1}CNPJ)
但当我加入&#39;分隔符&#39;它不起作用
'~((?<delimiter>((.*\n{1}CNPJ)+).*?(?=(?&delimiter)|\Z)))~s';
答案 0 :(得分:1)
这里是一个刺(需要&#39; g&#39;修饰符):
([IX]* - ((.*) - )?(.*)\nCNPJ: (.*)\ntest[0-9]: (.*)\nTest[0-9]: (.*))+
不确定您希望在&#34; XXXXXX&#34;字段,所以我把它们留作(.*)
。当然,你可以适应这些。
(。*)按顺序对应每个字段的标题和内容。
我不是真正的PHP家伙,但我希望这会有所帮助。
干杯, 圣保罗
PS:我同意John的观点 - 它可能更容易逐行处理。更新:修正了表达式以删除不必要的&#39; X&#39;
<强> UPDATE2 强>:
如果要捕获CNPJ(或任何其他特定字段),可以使用命名捕获。对于CNPJ,那将是([IX]* - ((.*) - )?(.*)\nCNPJ: (?P<cnpj>.*)\ntest[0-9]: (.*)\nTest[0-9]: (.*))+
答案 1 :(得分:0)
看起来你没有在PHP的正则表达式引擎中使用适当的命名组语法。如果要创建命名组,则应使用(?[regex])。不幸的是,大多数正则表达式引擎允许你使用(?p = groupName)引用正则表达式中的命名组,但是目前php不支持它。相反,您必须按编号引用该组。