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


Getting substring of a string that exists between patterns

我有一个这样的字符串:

$string = 'startTHISISTHESTRINGINEEDend'

我显然需要开始和结束之间的字符串。我尝试了正则表达式,但对于像我这样的新手来说很难,所以在这方面没有成功。端部的长度正在变化,因此 substr 功能不行。试图将strposstrstring结合起来,但也没有成功。我怎样才能做到这一点?

试试这个; 将提供一个详细的解释,所以正则表达式的整个概念被简化,这似乎不像是魔法:

$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。

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

$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))
);