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

时间:2014-05-26 22:24:01

标签: php regex string

我有一个这样的字符串:

$string = 'startTHISISTHESTRINGINEEDend'

我明显需要开始和结束之间的字符串。我尝试了正则表达式,但对于像我这样的新手来说很难,所以在那方面没有成功。末尾部分的长度正在发生变化,所以substr函数没有用。试图将strposstrstring合并,但也没有成功。我怎样才能做到这一点?

5 个答案:

答案 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)

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

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