如何查找字符串中位于两个标记之间的所有单词?

时间:2015-10-28 18:02:19

标签: php

我有一个函数返回两个标记词之间的第一个子串:

$opmerking = "This is an @Example@ or not? @Example2@ hehe."; 
$tag = get_string_between($opmerking, '@', '@');

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

现在它返回第一个单词:$tag = "Example"

但我希望它返回一个数组,其中 all @ @之间的单词。

可能是循环还是其他什么?

2 个答案:

答案 0 :(得分:0)

传递偏移量,并在每次调用函数时更改它。

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

答案 1 :(得分:0)

你关闭了。只需按照您的想法使用循环:

function get_string_between($string, $open, $close) {
  $matches = [];
  $begin = 0;
  while (false !== ($begin = strpos($string, $open, $begin))) {
    $begin += strlen($open);
    $end = strpos($string, $close, $begin);
    if (false !== $end) {
      $matches[] = substr($string, $begin, $end-$begin);
      $begin = $end + strlen($close);
    }
  }
  return $matches;
}

Live example at 3v4l.

请注意,如果您期望大字符串和许多匹配项,则生成器可能更适合。