1

指定された2つのキーワード(keyword1とkeyword2)の間の部分文字列を取得できる組み込みのphp関数があるかどうかを知りたいだけです。キーワードは文字列内で繰り返される可能性があるため、x 番目のキーワード 1 と y 番目のキーワード 2 の間の部分文字列を取得できる必要があることに注意してください。さらに、私は主にユニコード文字を使用しているため、関数は文字セットに依存しない必要があります。

この問題を処理するために私を助けてください。

例 $string=これは劇場で帽子をかぶった彼らの猫です。$keyword1="は"; $keyword2="the";

タスク: 上記の指定された文字列の 2 回目の "is" と 3 回目の "the" の間の部分文字列を取得する方法。

答え:「帽子をかぶった猫」

4

2 に答える 2

1

正規表現を使用できます。

$string = "This is their cat with a hat in the theater";

$regex1 = "/.*? is |^is/";
$regex2 = "/ the .*| the$/";
echo preg_replace($regex1, '', preg_replace($regex2, ' the', $string));

編集これはより一般的なコードです:

function find($text, $str, $offset) {
    $len = strlen($text);
    $search_len = strlen($str);
    $count = 0;
    for ($i=0; $i<$len; ++$i) {
        if (substr($text, $i, $search_len) == $str) {
            if (++$count == $offset) {
                return $i;
            }
        }
    }
    return -1;
}

function between($text, $word1, $offset1, $word2, $offset2) {
    $start = find($text, $word1, $offset1);
    $end = find($text, $word2, $offset2);
    if ($start != -1 && $end != -1) {
        return substr($text, $start + strlen($word1), $end-$start-strlen($word2));
    } else {
        return '';
    }
}


$string = "This is their cat with a hat in the theater";

echo between($string, 'is', 2, 'the', 3);
echo between($string, 'at', 1, 'at', 3);
于 2013-07-11T13:26:20.590 に答える
0

次の 2 つの関数の組み合わせは、Unicode 文字を含む任意の文字列に対して機能します。

//Gets the position of a given substring with its offset;
function strposOffset($string, $search, $offset)
{
    /*** explode the string ***/
    $arr = explode($search, $string);
    /*** check the search is not out of bounds ***/
   switch( $offset )
   {
       case $offset == 0:
         return false;
         break;

       case $offset > max(array_keys($arr)):
         return false;
         break;

       default:
         return mb_strlen(implode($search, array_slice($arr, 0, $offset)), "utf-8");
   }
} //Source: www.phpro.org



//Extracts a substring between given two given substrings with their offsets.
function extractMiddleSubstr($string, $substr1, $offset1, $substr2, $offset2){

   $strlen_substr1 = mb_strlen($substr1, "utf-8"); //length of substr1;
   $strpos_substr1  = strposOffset($string, $substr1, $offset1); //position of substr1;
   $strpos_substr2  = strposOffset($string, $substr2, $offset2); //position of substr2;

    if($strpos_substr1!==null && $strpos_substr2!==null && $strpos_substr1!==false && $strpos_substr2!==false){

       if($strpos_substr1<=$strpos_substr2){

          $strpos_substr    = $strlen_substr1+$strpos_substr1; //position of substr;
          $strlen_substr  = $strpos_substr2-$strpos_substr;  //length of substr;

          $substr       = mb_substr($string, $strpos_substr, $strlen_substr, "utf-8"); //substr;
          $substr           = trim($substr); // removes whitespaces;

          return $substr;
        }else{
          return false;
        }

    }else{
        return false;
    }
}
于 2013-07-16T07:37:30.823 に答える