我有一个这样的字符串:
$string = 'startTHISISTHESTRINGINEEDend'
我明显需要开始和结束之间的字符串。我尝试了正则表达式,但对于像我这样的新手来说很难,所以在那方面没有成功。末尾部分的长度正在发生变化,所以substr函数没有用。试图将strpos
与strstring
合并,但也没有成功。我怎样才能做到这一点?
答案 0 :(得分:2)
试试这个;将提供一个详细的解释,因此简化正则表达式的整个概念似乎并不神奇:
$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 manual on pattern modifiers:如果设置了此修改器,则模式中的点元字符匹配 所有字符,包括换行符。如果没有它,则排除换行符。 此修饰符等效于Perl的/ s修饰符。负面的一类 例如[^ a]始终匹配换行符,独立于换行符 设置此修饰符。
如果您希望包含非字母数字字符,则可以使用此(.*?)
代替([a-z0-9]+)
。但是从您的请求中不清楚,因为您只显示字母字符。或者,如果您想捕获特定的非字母数字字符,例如%
,/
&amp; ^
然后执行此操作:([a-z0-9%\/^]+)
。请注意/
如何设置为\/
。添加\
转义/
使得preg_match
意识到它需要明确匹配/
&amp;不要将其解释为正则表达式逻辑的一部分。
$matches
的输出将是:
Array
(
[0] => startTHISISTHESTRINGINEEDend
[1] => THISISTHESTRINGINEED
)
所以只需参考$matches[1]
。
echo $matches[1];
输出将是:
THISISTHESTRINGINEED
答案 1 :(得分:0)
$string = str_replace("start","", $string);
$string = str_replace("end","", $string);
echo $string;
不是明智的解决方案,但可能足够
答案 2 :(得分:0)
start(.*?)end
然后得到第1组。在demo中查看第1组。
答案 3 :(得分:0)
如果您的start
和end
出现在字符串中的某个位置(仅一次)并且您不想使用正则表达式,则可以使用以下解决方案:
$string = 'HIstartTHISISTHESTRINGINEEDendANDOTHERSTUFFHERE';
$start = strpos($string, 'start') + strlen('start');
$end = strrpos($string, 'end');
$result = substr($string, $start, $end-$start);
var_dump($result);
答案 4 :(得分:0)
$string = 'xwerwstartTHISISTHESTRINGINEEDasdwerendwerq';
$start = 'start';
$stop = 'end';
echo substr($string,
strlen($start) + strpos($string, $start),
strpos($string, $stop) - (strpos($string, $start) + strlen($start))
);