我有一个这样的字符串:
$string = 'startTHISISTHESTRINGINEEDend'
我显然需要开始和结束之间的字符串。我尝试了正则表达式,但对于像我这样的新手来说很难,所以在这方面没有成功。端部的长度正在变化,因此 substr 功能不行。试图将strpos
与strstring
结合起来,但也没有成功。我怎样才能做到这一点?
试试这个; 将提供一个详细的解释,所以正则表达式的整个概念被简化,这似乎不像是魔法:
$string = "startTHISISTHESTRINGINEEDend";
preg_match("/^start([a-z0-9]+)end$/is", $string, $matches, null, 0);
echo '<pre>';
print_r($matches);
echo '</pre>';
正则表达式相当简单。这是解释。
- 在字符串的开头匹配
start
;这就是^
的意思。 - 接下来,
(
和)
的括号基本上意味着您正在捕获括号之间的内容。 - 因此,在
(
和)
之间是正则表达式逻辑,仅捕获由[a-z0-9]+
表示的字母数字字符。 - 在字符串末尾匹配
end
;这就是$
的意思。 - 正则表达式末尾的
is
基本上意味着通过i
(又名:PCRE_CASELESS
(确保匹配不区分大小写,然后s
指示一个PCRE_DOTALL
,如 PHP 手册中关于模式修饰符的说明:
如果设置了此修饰符,则模式中的点元字符匹配 所有字符,包括换行符。没有它,换行符将被排除在外。 这个修饰符等效于 Perl 的/s 修饰符。负类 例如 [^a] 始终匹配换行符,与 此修饰符的设置。
如果您希望包含非字母数字字符,您可以使用此(.*?)
而不是([a-z0-9]+)
。但是从您的请求中不清楚,因为您只显示字母字符。或者,如果您想捕获特定的非字母数字字符,如%
,/
和^
,那么只需这样做:([a-z0-9%'/^]+)
。请注意如何将/
设置为 '/
。添加'
会逃脱/
,这使preg_match
意识到它需要显式匹配/
,而不是将其解释为正则表达式逻辑的一部分。
$matches
的输出将是:
Array
(
[0] => startTHISISTHESTRINGINEEDend
[1] => THISISTHESTRINGINEED
)
因此,只需通过参考访问它 $matches[1]
.
echo $matches[1];
输出将是:
THISISTHESTRINGINEED
$string = str_replace("start","", $string);
$string = str_replace("end","", $string);
echo $string;
不是一个明智的解决方案,但可能足够了
start(.*?)end
然后获取组#1。在演示中查看组#1。
如果start
和end
出现在字符串中的某个位置(仅一次(,并且您不想使用正则表达式,则可以使用以下解决方案:
$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))
);