PHP如何在某些关键字之间获取子字符串
我有一根(奇怪的)线,像:PHP如何在某些关键字之间获取子字符串,php,regex,string,Php,Regex,String,我有一根(奇怪的)线,像: EREF+012345678901234MREF+ABCDEF01234567890123CRED+DE12ABC01234567890SVWZ+ABCEDFG HIJ 01234567890 123,45ABWA+ABCDEFGHIJKLMNOPQR 我需要查找的模式只能由关键字定义:EREF+、MREF+、CRED+和其他关键字。我知道有19个关键字,但是字符串可能包含这19个关键字的不同子集。我不知道顺序是否保持不变,据我所知,EREF+很可能是第一个关键字,但
EREF+012345678901234MREF+ABCDEF01234567890123CRED+DE12ABC01234567890SVWZ+ABCEDFG HIJ 01234567890 123,45ABWA+ABCDEFGHIJKLMNOPQR
我需要查找的模式只能由关键字定义:EREF+
、MREF+
、CRED+
和其他关键字。我知道有19个关键字,但是字符串可能包含这19个关键字的不同子集。我不知道顺序是否保持不变,据我所知,EREF+
很可能是第一个关键字,但顺序也可能不同。我也不知道19个关键字中的哪一个可能是字符串中的最后一个,因为这可能会根据具体情况而变化
我的第一种方法是只使用explode()两次,使用关键字1和关键字2–但是如果关键字改变顺序(我不能保证它们不会),我将不得不经历所有可能的组合
无论如何,这里是我使用的第一个(工作)代码:
<?php
$string = "EREF+012345678901234MREF+ABCDEF01234567890123CRED+DE12ABC01234567890SVWZ+ABCEDFG HIJ 01234567890 123,45ABWA+ABCDEFGHIJKLMNOPQR";
function getBetween($content,$start,$end){
$r = explode($start, $content);
if (isset($r[1])){
$r = explode($end, $r[1]);
return $start.$r[0];
}
return '';
}
$start = "EREF+";
$end = "MREF+";
$output = getBetween($string,$start,$end);
echo $output;
?>
有人能给我建议吗?感谢您的帮助
谢谢您可以使用此正则表达式:
/(?<=EREF\+|MREF\+|CRED\+|SVWZ\+|ABWA\+)(.+?)(?=EREF\+|MREF\+|CRED\+|SVWZ\+|ABWA\+|$)/
/((?:EREF\+|MREF\+|CRED\+|SVWZ\+|ABWA\+))(.+?)(?=EREF\+|MREF\+|CRED\+|SVWZ\+|ABWA\+|$)/
它将捕获第一个关键字和关键字之间的文本
(?<=EREF\+|MREF\+|CRED\+|SVWZ\+|ABWA\+) # look backward for a keyword
(.+?) #Match any character, non greedy
(?=EREF\+|MREF\+|CRED\+|SVWZ\+|ABWA\+|$) # Look forward for a keyword or end of string
您需要知道是哪个关键字导致了拆分吗?可能是
preg\u split
?你是对的,我确实需要知道是哪个关键字导致了拆分。我还没想过呢。preg_split
方法+1。在和的帮助下,我成功地将您的代码分叉,将导致拆分的关键字作为键包含在关联数组中:感谢您的快速响应!但不幸的是,在我的示例中,ABWA+
不会得到最后一次出现的关键字。你知道怎么处理吗?最后一个不是在关键字之间,但是你可以把$
作为一个选项放在前面,我会更新答案哇,很有魅力!谢谢@克里斯提出了一个我还没有想到的想法。如何知道哪些关键字实际导致了字符串的拆分?就我所见,这在正则表达式中是不可能的,对吗?我在答案中包含了导致拆分的关键字
(?<=EREF\+|MREF\+|CRED\+|SVWZ\+|ABWA\+) # look backward for a keyword
(.+?) #Match any character, non greedy
(?=EREF\+|MREF\+|CRED\+|SVWZ\+|ABWA\+|$) # Look forward for a keyword or end of string
/((?:EREF\+|MREF\+|CRED\+|SVWZ\+|ABWA\+))(.+?)(?=EREF\+|MREF\+|CRED\+|SVWZ\+|ABWA\+|$)/