3

確かにこれはすでに他の誰かから尋ねられていますが、私はここでSOを検索しましたが、何も見つかりませんでし

文字列があり、2 つの区切り文字 (2 単語) の間に含まれるすべての単語を含む配列を取得したいと考えています。私は正規表現に自信がないので、この解決策に行き着きましたが、最初のものだけでなく、これらの要件に一致するすべての単語を取得する必要があるため、適切ではありません。

$start_limiter = 'First';
$end_limiter = 'Second';
$haystack = $string;

# Step 1. Find the start limiter's position

$start_pos = strpos($haystack,$start_limiter);
if ($start_pos === FALSE)
{
    die("Starting limiter ".$start_limiter." not found in ".$haystack);
}

# Step 2. Find the ending limiters position, relative to the start position

$end_pos = strpos($haystack,$end_limiter,$start_pos);

if ($end_pos === FALSE)
{
    die("Ending limiter ".$end_limiter." not found in ".$haystack);
}

# Step 3. Extract the string between the starting position and ending position
# Our starting is the position of the start limiter. To find the string we must take
# the ending position of our end limiter and subtract that from the start limiter
$needle = substr($haystack, $start_pos+1, ($end_pos-1)-$start_pos);

echo "Found $needle";

また、explode() を使用することも考えましたが、正規表現の方が優れていて高速であると思います。

4

5 に答える 5

8

私はPHPにあまり詳しくありませんが、次のようなものを使用できるようです:

if (preg_match("/(?<=First).*?(?=Second)/s", $haystack, $result))
    print_r($result[0]);

(?<=First)後ろに目を向けFirstますが、それを消費しません。

.*?Firstとの間のすべてをキャプチャしますSecond

(?=Second)先を見据えますSecondが、それを消費しません。

最後のsは、ドットが.改行に一致するようにすることです。


これらの区切り文字の間のすべてのテキストを取得preg_match_allするには、ループを使用して各要素を取得できます。

if (preg_match_all("/(?<=First)(.*?)(?=Second)/s", $haystack, $result))
    for ($i = 1; count($result) > $i; $i++) {
        print_r($result[$i]);
    }
于 2013-08-12T18:35:37.740 に答える
3

結果がコードよりも高速になるかどうかはわかりませんが、正規表現を使用して次のように実行できます。

$pattern = '~(?<=' . preg_quote($start, '~') 
         . ').+?(?=' . preg_quote($end, '~') . ')~si';
if (preg_match($pattern, $subject, $match))
    print_r($match[0]);

preg_quoteを使用して、正規表現で特別な意味を持つすべての文字をエスケープします (+*|()[]{}.?およびパターン区切り文字~など) 。

(?<=..)検索対象の前に部分文字列をチェックする後読みアサーションです。
(?=..)先読みアサーション (after についても同じ)
.+?は、すべての文字を 1 回または複数回意味しますが、可能性は低くなります (疑問符は量指定子を遅延させます)。

sドットが改行に一致することを許可します (デフォルトの動作ではありません)
i検索で大文字と小文字を区別しません (必要がない場合は削除できます)

于 2013-08-12T18:34:28.343 に答える
2

これは、string の単語 'mega' と 'yo' の間のすべてを検索する簡単な例です$t

PHP の例

$t = "I am super mega awesome-sauce, yo!";

$arr = [];
preg_match("/mega\ (.*?)\ yo/ims", $t, $arr);

echo $arr[1];

PHP 出力

awesome-sauce,
于 2013-08-12T18:35:26.917 に答える
0

また、explode ステートメントを 2 つ使用することもできます。

たとえば、y=mx^z+b で "z" を取得したいとします。z を取得するには:

$formula="y=mx^z+b";
$z=explode("+",explode("^",$formula)[1])[0];

最初に^の後にすべてを取得します:explode("^",$formula)[1]

次に、+ の前にすべてを取得します。explode("+",$previousExplode)[0]

于 2016-01-14T14:26:48.083 に答える