获取带有索引的函数之间的字符串

时间:2019-02-20 02:42:33

标签: php

我一直在使用此功能

function get_string_between($string, $start, $end){
  $string = ' ' . $string;
  $ini = strpos($string, $start);
  if ($ini == 0) return '';
  $ini += strlen($start);
  $len = strpos($string, $end, $ini) - $ini;
  return substr($string, $ini, $len);
}

由于年代久远,一切正常,但是现在我需要指定索引,例如在这样的代码中:

<abc>Max</def><abc>Mike</def><abc>Roy</def>

我想获得“麦克”,所以我想使用

get_string_between($string, "<abc>", "</def>", 1)

我找不到任何解决方案,也无法使用Regex。谢谢您的帮助。

2 个答案:

答案 0 :(得分:1)

使用strpos的$ offset参数跳过以前的事件。

  • 用0预先声明$ini

  • do / while循环中包装$ini = strpos(…, $ini)

  • $index--大于零时使其循环。

  • 并在条件中直接增加&& ++$ini,因此strpos确实会寻找下一个事件。

答案 1 :(得分:1)

我看不出您为什么不能使用正则表达式的任何原因。 preg_quote会在正则表达式中转义具有特殊含义的任何字符,以使其成为文字。传递定界符(在PHP中是任意的-通常使用斜杠/)也可以逃脱该定界符。

<?php
declare (strict_types=1);

function get_string_between(string $string, string $start, string $end, int $index = 0)
{
  if(false === ($c = preg_match_all('/' . preg_quote($start, '/') . '(.*?)' . preg_quote($end, '/') . '/us', $string, $matches)))
    return false;

  if($index < 0)
    $index += $c;

  return $index < 0 || $index >= $c
    ? false
    : $matches[1][$index]
  ;
}

$s = '<abc>Max</def><abc>Mike</def><abc>Roy</def>';

var_dump(get_string_between($s, '<abc>', '</def>'    ));  // Max
var_dump(get_string_between($s, '<abc>', '</def>',  1));  // Mike
// negative means from the end
var_dump(get_string_between($s, '<abc>', '</def>', -1));  // Roy