2つの単語(または2つの文字)の間の部分文字列を返す関数が必要です。それを実現するphp関数があるかどうか疑問に思っています。正規表現については考えたくありません(まあ、1つはできますが、それが最善の方法だとは思いません)。 strpos
およびsubstr
関数を考える。以下に例を示します。
$string = "foo I wanna a cake foo";
関数を呼び出します:$substring = getInnerSubstring($string,"foo");
戻ります:「ケーキを食べたい」。
前もって感謝します。
更新:さて、これまでは、1つの文字列に2つの単語からなる部分文字列を取得できますが、少し先に進んで、getInnerSubstring($str,$delim)
の使用を拡張してdelim値の間にある文字列、例:
$string =" foo I like php foo, but foo I also like asp foo, foo I feel hero foo";
{"I like php", "I also like asp", "I feel hero"}
のような配列を取得します。
文字列が異なる場合(例:[foo]&[/ foo])、Justin Cookの this post をご覧ください。以下に彼のコードをコピーします。
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);
}
$fullstring = 'this is my [tag]dog[/tag]';
$parsed = get_string_between($fullstring, '[tag]', '[/tag]');
echo $parsed; // (result = dog)
正規表現を使用する方法です。
$str = 'before-str-after';
if (preg_match('/before-(.*?)-after/', $str, $match) == 1) {
echo $match[1];
}
function getBetween($string, $start = "", $end = ""){
if (strpos($string, $start)) { // required if $start not exist in $string
$startCharCount = strpos($string, $start) + strlen($start);
$firstSubStr = substr($string, $startCharCount, strlen($string));
$endCharCount = strpos($firstSubStr, $end);
if ($endCharCount == 0) {
$endCharCount = strlen($firstSubStr);
}
return substr($firstSubStr, 0, $endCharCount);
} else {
return '';
}
}
使用例:
echo getBetween("a","c","abc"); // returns: 'b'
echo getBetween("h","o","hello"); // returns: 'ell'
echo getBetween("a","r","World"); // returns: ''
function getInnerSubstring($string,$delim){
// "foo a foo" becomes: array(""," a ","")
$string = explode($delim, $string, 3); // also, we only need 2 items at most
// we check whether the 2nd is set and return it, otherwise we return an empty string
return isset($string[1]) ? $string[1] : '';
}
使用例:
var_dump(getInnerSubstring('foo Hello world foo','foo'));
// prints: string(13) " Hello world "
周囲の空白を削除する場合は、trim
を使用します。例:
var_dump(trim(getInnerSubstring('foo Hello world foo','foo')));
// prints: string(11) "Hello world"
function getInbetweenStrings($start, $end, $str){
$matches = array();
$regex = "/$start([a-zA-Z0-9_]*)$end/";
preg_match_all($regex, $str, $matches);
return $matches[1];
}
$str = "C://@@ad_custom_attr1@@/@@upn@@/@@samaccountname@@"; $str_arr = getInbetweenStrings('@@', '@@', $str); print_r($str_arr);
私は正規表現ソリューションが好きですが、他のどれも私に合いません。
結果が1つだけになることがわかっている場合は、次を使用できます。
$between = preg_replace('/(.*)BEFORE(.*)AFTER(.*)/sm', '\2', $string);
BEFOREおよびAFTERを目的の区切り文字に変更します。
また、この関数は何も一致しない場合に文字列全体を返すことに注意してください。
このソリューションは複数行ですが、ニーズに応じて修飾子を使用できます。
strstr php関数を2回使用します。
$value = "This is a great day to be alive";
$value = strstr($value, "is"); //gets all text from needle on
$value = strstr($value, "be", true); //gets all text before needle
echo $value;
出力:"is a great day to"
foo
を区切り文字として使用している場合は、explode()
を見てください
<?php
function getBetween($content,$start,$end){
$r = explode($start, $content);
if (isset($r[1])){
$r = explode($end, $r[1]);
return $r[0];
}
return '';
}
?>
例:
<?php
$content = "Try to find the guy in the middle with this function!";
$start = "Try to find ";
$end = " with this function!";
$output = getBetween($content,$start,$end);
echo $output;
?>
これは「真ん中の男」を返します。
単一の文字列から複数の繰り返しがあり、異なる[開始]と[\終了]パターンがある場合。これは配列を出力する関数です。
function get_string_between($string, $start, $end){
$split_string = explode($end,$string);
foreach($split_string as $data) {
$str_pos = strpos($data,$start);
$last_pos = strlen($data);
$capture_len = $last_pos - $str_pos;
$return[] = substr($data,$str_pos+1,$capture_len);
}
return $return;
}
PHPのプロではありません。しかし、私は最近この壁にも出会いました。これが私が思いついたものです。
function tag_contents($string, $tag_open, $tag_close){
foreach (explode($tag_open, $string) as $key => $value) {
if(strpos($value, $tag_close) !== FALSE){
$result[] = substr($value, 0, strpos($value, $tag_close));;
}
}
return $result;
}
$string = "i love cute animals, like [animal]cat[/animal],
[animal]dog[/animal] and [animal]panda[/animal]!!!";
echo "<pre>";
print_r(tag_contents($string , "[animal]" , "[/animal]"));
echo "</pre>";
//result
Array
(
[0] => cat
[1] => dog
[2] => panda
)
私が使う
if (count(explode("<TAG>", $input))>1){
$content = explode("</TAG>",explode("<TAG>", $input)[1])[0];
}else{
$content = "";
}
必要な区切り文字を<TAG>に置き換えます。
つかいます:
<?php
$str = "...server daemon started with pid=6849 (parent=6848).";
$from = "pid=";
$to = "(";
echo getStringBetween($str,$from,$to);
function getStringBetween($str,$from,$to)
{
$sub = substr($str, strpos($str,$from)+strlen($from),strlen($str));
return substr($sub,0,strpos($sub,$to));
}
?>
これは私がこれに使用している機能です。単一または複数の区切り文字の1つの関数に2つの回答を組み合わせました。
function getStringBetweenDelimiters($p_string, $p_from, $p_to, $p_multiple=false){
//checking for valid main string
if (strlen($p_string) > 0) {
//checking for multiple strings
if ($p_multiple) {
// getting list of results by end delimiter
$result_list = explode($p_to, $p_string);
//looping through result list array
foreach ( $result_list AS $rlkey => $rlrow) {
// getting result start position
$result_start_pos = strpos($rlrow, $p_from);
// calculating result length
$result_len = strlen($rlrow) - $result_start_pos;
// return only valid rows
if ($result_start_pos > 0) {
// cleanying result string + removing $p_from text from result
$result[] = substr($rlrow, $result_start_pos + strlen($p_from), $result_len);
}// end if
} // end foreach
// if single string
} else {
// result start point + removing $p_from text from result
$result_start_pos = strpos($p_string, $p_from) + strlen($p_from);
// lenght of result string
$result_length = strpos($p_string, $p_to, $result_start_pos);
// cleaning result string
$result = substr($p_string, $result_start_pos+1, $result_length );
} // end if else
// if empty main string
} else {
$result = false;
} // end if else
return $result;
} // end func. get string between
単純な使用(2を返す):
$result = getStringBetweenDelimiters(" one two three ", 'one', 'three');
テーブルの各行を結果配列に取得する場合:
$result = getStringBetweenDelimiters($table, '<tr>', '</tr>', true);
PHPのstrpos
スタイルでは、開始マークfalse
または終了マークsm
が見つからない場合、これはem
を返します。
この結果(false
)は、空の文字列からdifferentになります。これは、開始マークと終了マークの間に何もない場合に得られるものです。
function between( $str, $sm, $em )
{
$s = strpos( $str, $sm );
if( $s === false ) return false;
$s += strlen( $sm );
$e = strpos( $str, $em, $s );
if( $e === false ) return false;
return substr( $str, $s, $e - $s );
}
関数は最初の一致のみを返します。
明らかですが、関数は最初にsm
を探し、次にem
を探すことに注意してください。
これは、最初にem
を検索する必要があり、次にsm
を検索する際に文字列を逆方向に解析する必要がある場合、目的の結果/動作が得られないことを意味します。
Alejandroの答え の改善。 $start
または$end
引数を空のままにすると、文字列の先頭または末尾が使用されます。
echo get_string_between("Hello my name is bob", "my", ""); //output: " name is bob"
private function get_string_between($string, $start, $end){ // Get
if($start != ''){ //If $start is empty, use start of the string
$string = ' ' . $string;
$ini = strpos($string, $start);
if ($ini == 0) return '';
$ini += strlen($start);
}
else{
$ini = 0;
}
if ($end == '') { //If $end is blank, use end of string
return substr($string, $ini);
}
else{
$len = strpos($string, $end, $ini) - $ini; //Work out length of string
return substr($string, $ini, $len);
}
}
GarciaWebDevとHenry Wangからの少し改善されたコード。空の$ startまたは$ endが指定されている場合、関数は$ stringの先頭または末尾から値を返します。検索結果を含めるかどうかにかかわらず、包括的オプションも利用できます。
function get_string_between ($string, $start, $end, $inclusive = false){
$string = " ".$string;
if ($start == "") { $ini = 0; }
else { $ini = strpos($string, $start); }
if ($end == "") { $len = strlen($string); }
else { $len = strpos($string, $end, $ini) - $ini;}
if (!$inclusive) { $ini += strlen($start); }
else { $len += strlen($end); }
return substr($string, $ini, $len);
}
Julius Tilvikasの投稿に何かを追加する必要があります。私は彼が彼の投稿で説明したこのような解決策を探しました。しかし、間違いがあると思います。私は2つの文字列の間の文字列を実際に取得しません。開始文字列の長さを減算する必要があるため、このソリューションでもより多くを取得します。これを行うと、私は本当に2つの文字列の間の文字列を取得します。
彼のソリューションの私の変更点は次のとおりです。
function get_string_between ($string, $start, $end, $inclusive = false){
$string = " ".$string;
if ($start == "") { $ini = 0; }
else { $ini = strpos($string, $start); }
if ($end == "") { $len = strlen($string); }
else { $len = strpos($string, $end, $ini) - $ini - strlen($start);}
if (!$inclusive) { $ini += strlen($start); }
else { $len += strlen($end); }
return substr($string, $ini, $len);
}
グリーツ
V
これを試してみてください、その仕事はtest Wordの間のデータを取得します。
$str = "Xdata test HD01 test 1data";
$result = explode('test',$str);
print_r($result);
echo $result[1];
いくつかのエラーをキャッチします。具体的には、提示された関数のほとんどは、$ endが存在する必要がありますが、実際には、私の場合はオプションにする必要がありました。これは$ endはオプションであり、$ startがまったく存在しない場合はFALSEを評価します。
function get_string_between( $string, $start, $end ){
$string = " " . $string;
$start_ini = strpos( $string, $start );
$end = strpos( $string, $end, $start+1 );
if ($start && $end) {
return substr( $string, $start_ini + strlen($start), strlen( $string )-( $start_ini + $end ) );
} elseif ( $start && !$end ) {
return substr( $string, $start_ini + strlen($start) );
} else {
return FALSE;
}
}
ここでの回答の大半は、編集された部分に答えていません。以前に追加されたと思います。 1つの答えが言及しているように、正規表現で行うことができます。別のアプローチがありました。
この関数は、$ stringを検索し、$-offset位置から始まる最初の文字列 $ startと$ end文字列を検索します。次に、結果の開始を指すように$ offset位置を更新します。 $ includeDelimitersがtrueの場合、結果に区切り文字が含まれます。
$ startまたは$ end文字列が見つからない場合、nullを返します。また、$ string、$ start、または$ endが空の文字列の場合はnullを返します。
function str_between(string $string, string $start, string $end, bool $includeDelimiters = false, int &$offset = 0): ?string
{
if ($string === '' || $start === '' || $end === '') return null;
$startLength = strlen($start);
$endLength = strlen($end);
$startPos = strpos($string, $start, $offset);
if ($startPos === false) return null;
$endPos = strpos($string, $end, $startPos + $startLength);
if ($endPos === false) return null;
$length = $endPos - $startPos + ($includeDelimiters ? $endLength : -$startLength);
if (!$length) return '';
$offset = $startPos + ($includeDelimiters ? 0 : $startLength);
$result = substr($string, $offset, $length);
return ($result !== false ? $result : null);
}
次の関数は2つの文字列の間にあるすべての文字列(重複なし)を検出します。前の関数が必要であり、引数は同じです。実行後、$ offsetは最後に見つかった結果文字列の先頭を指します。
function str_between_all(string $string, string $start, string $end, bool $includeDelimiters = false, int &$offset = 0): ?array
{
$strings = [];
$length = strlen($string);
while ($offset < $length)
{
$found = str_between($string, $start, $end, $includeDelimiters, $offset);
if ($found === null) break;
$strings[] = $found;
$offset += strlen($includeDelimiters ? $found : $start . $found . $end); // move offset to the end of the newfound string
}
return $strings;
}
例:
str_between_all('foo 1 bar 2 foo 3 bar', 'foo', 'bar')
は[' 1 ', ' 3 ']
を提供します。
str_between_all('foo 1 bar 2', 'foo', 'bar')
は[' 1 ']
を提供します。
str_between_all('foo 1 foo 2 foo 3 foo', 'foo', 'foo')
は[' 1 ', ' 3 ']
を提供します。
str_between_all('foo 1 bar', 'foo', 'foo')
は[]
を提供します。
@Alejandro Iglesias回答のUTF-8バージョンは、非ラテン文字に対して機能します。
function get_string_between($string, $start, $end){
$string = ' ' . $string;
$ini = mb_strpos($string, $start, 0, 'UTF-8');
if ($ini == 0) return '';
$ini += mb_strlen($start, 'UTF-8');
$len = mb_strpos($string, $end, $ini, 'UTF-8') - $ini;
return mb_substr($string, $ini, $len, 'UTF-8');
}
$fullstring = 'this is my [tag]dog[/tag]';
$parsed = get_string_between($fullstring, '[tag]', '[/tag]');
echo $parsed; // (result = dog)
アレハンドロ・ガルシア・イグレシアスが書いたものの編集版。
これにより、結果が見つかった回数に基づいて、取得する文字列の特定の場所を選択できます。
function get_string_between_pos($string, $start, $end, $pos){
$cPos = 0;
$ini = 0;
$result = '';
for($i = 0; $i < $pos; $i++){
$ini = strpos($string, $start, $cPos);
if ($ini == 0) return '';
$ini += strlen($start);
$len = strpos($string, $end, $ini) - $ini;
$result = substr($string, $ini, $len);
$cPos = $ini + $len;
}
return $result;
}
使用法:
$text = 'string has start test 1 end and start test 2 end and start test 3 end to print';
//get $result = "test 1"
$result = $this->get_string_between_pos($text, 'start', 'end', 1);
//get $result = "test 2"
$result = $this->get_string_between_pos($text, 'start', 'end', 2);
//get $result = "test 3"
$result = $this->get_string_between_pos($text, 'start', 'end', 3);
strpos には、特定のポイントで検索を開始するための追加のオプション入力があります。そのため、前の位置を$ cPosに保存します。これにより、forループが再びチェックするときに、中断した場所の終わりから開始されます。
ここで使用されているget_string_between()関数に問題がありました。だから私は自分のバージョンで来ました。たぶんそれは私の場合と同じ場合に人々を助けることができます。
protected function string_between($string, $start, $end, $inclusive = false) {
$fragments = explode($start, $string, 2);
if (isset($fragments[1])) {
$fragments = explode($end, $fragments[1], 2);
if ($inclusive) {
return $start.$fragments[0].$end;
} else {
return $fragments[0];
}
}
return false;
}
つかいます:
function getdatabetween($string, $start, $end){
$sp = strpos($string, $start)+strlen($start);
$ep = strpos($string, $end)-strlen($start);
$data = trim(substr($string, $sp, $ep));
return trim($data);
}
$dt = "Find string between two strings in PHP";
echo getdatabetween($dt, 'Find', 'in PHP');
しばらく前にこれらを書いて、それが広範囲のアプリケーションにとって非常に有用であるとわかりました。
<?php
// substr_getbykeys() - Returns everything in a source string that exists between the first occurance of each of the two key substrings
// - only returns first match, and can be used in loops to iterate through large datasets
// - arg 1 is the first substring to look for
// - arg 2 is the second substring to look for
// - arg 3 is the source string the search is performed on.
// - arg 4 is boolean and allows you to determine if returned result should include the search keys.
// - arg 5 is boolean and can be used to determine whether search should be case-sensative or not.
//
function substr_getbykeys($key1, $key2, $source, $returnkeys, $casematters) {
if ($casematters === true) {
$start = strpos($source, $key1);
$end = strpos($source, $key2);
} else {
$start = stripos($source, $key1);
$end = stripos($source, $key2);
}
if ($start === false || $end === false) { return false; }
if ($start > $end) {
$temp = $start;
$start = $end;
$end = $temp;
}
if ( $returnkeys === true) {
$length = ($end + strlen($key2)) - $start;
} else {
$start = $start + strlen($key1);
$length = $end - $start;
}
return substr($source, $start, $length);
}
// substr_delbykeys() - Returns a copy of source string with everything between the first occurance of both key substrings removed
// - only returns first match, and can be used in loops to iterate through large datasets
// - arg 1 is the first key substring to look for
// - arg 2 is the second key substring to look for
// - arg 3 is the source string the search is performed on.
// - arg 4 is boolean and allows you to determine if returned result should include the search keys.
// - arg 5 is boolean and can be used to determine whether search should be case-sensative or not.
//
function substr_delbykeys($key1, $key2, $source, $returnkeys, $casematters) {
if ($casematters === true) {
$start = strpos($source, $key1);
$end = strpos($source, $key2);
} else {
$start = stripos($source, $key1);
$end = stripos($source, $key2);
}
if ($start === false || $end === false) { return false; }
if ($start > $end) {
$temp = $start;
$start = $end;
$end = $temp;
}
if ( $returnkeys === true) {
$start = $start + strlen($key1);
$length = $end - $start;
} else {
$length = ($end + strlen($key2)) - $start;
}
return substr_replace($source, '', $start, $length);
}
?>
tonyspiro からこれに最適なソリューションを得ました
function getBetween($content,$start,$end){
$r = explode($start, $content);
if (isset($r[1])){
$r = explode($end, $r[1]);
return $r[0];
}
return '';
}