Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP如何在某些关键字之间获取子字符串_Php_Regex_String - Fatal编程技术网

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\+|$)/