Php 获取模式之间存在的字符串的子字符串

Php 获取模式之间存在的字符串的子字符串,php,regex,string,Php,Regex,String,我有这样一个字符串: $string = 'startTHISISTHESTRINGINEEDend' 很明显,我需要从开始到结束之间的线。我试过regex,但对于像我这样的新手来说很难,所以在这方面没有成功。端部的长度正在更改,因此substr函数无法使用。尝试将strop与strstring组合,但也没有成功。我怎样才能做到这一点 $string = str_replace("start","", $string); $string = str_replace("end","", $str

我有这样一个字符串:

$string = 'startTHISISTHESTRINGINEEDend'
很明显,我需要从开始到结束之间的线。我试过regex,但对于像我这样的新手来说很难,所以在这方面没有成功。端部的长度正在更改,因此substr函数无法使用。尝试将
strop
strstring
组合,但也没有成功。我怎样才能做到这一点

$string = str_replace("start","", $string);
$string = str_replace("end","", $string);
echo $string;

这不是一个明智的解决方案,但可能已经足够了;将提供一个详细的解释,以便简化正则表达式的整个概念,这看起来不像魔术:

$string = "startTHISISTHESTRINGINEEDend";

preg_match("/^start([a-z0-9]+)end$/is", $string, $matches, null, 0);

echo '<pre>';
print_r($matches);
echo '</pre>';
因此,只需参考
$matches[1]
即可访问它

THISISTHESTRINGINEED
产出将是:

echo $matches[1];
start(.*?)end

然后得到第1组。看第1组

如果您的
开始
结束
出现在字符串中的某个位置(仅出现一次),并且您不想使用正则表达式,则可以使用以下解决方案:

$string = 'xwerwstartTHISISTHESTRINGINEEDasdwerendwerq';

$start = 'start';
$stop = 'end';

echo substr($string, 
    strlen($start) + strpos($string, $start), 
    strpos($string, $stop) - (strpos($string, $start) + strlen($start))
);

我将删除我的答案而代之以您的答案,因为您有一个特定于PHP的解决方案。为了这张海报的缘故,你能简单地编辑一下说明
[a-z0-9]+
做了什么吗?天哪。我想你刚刚回答了50%关于堆栈溢出的正则表达式问题。这真是一个很好的解释。谢谢。但是我没有得到[a-z0-9]+部分。那么像%/^这样的字符将被忽略?@CanNuhlar“但是我没有得到
[a-z0-9]+
部分。那么像
%
/
^
这样的字符将被忽略?”是的,但只要用
(.*?
替换
([a-z0-9]+)
就可以捕获所有内容。请阅读我上面的解释。如果要添加
%
/
&
^
,只需执行以下操作:
([a-z0-9%\/^]+)
。又加了一个例子。@JakeGould再次非常感谢
$string = 'HIstartTHISISTHESTRINGINEEDendANDOTHERSTUFFHERE';
$start = strpos($string, 'start') + strlen('start');
$end = strrpos($string, 'end');
$result = substr($string, $start, $end-$start);
var_dump($result);
$string = 'xwerwstartTHISISTHESTRINGINEEDasdwerendwerq';

$start = 'start';
$stop = 'end';

echo substr($string, 
    strlen($start) + strpos($string, $start), 
    strpos($string, $stop) - (strpos($string, $start) + strlen($start))
);