次の文字列$str
では、データを分解/分割して、「abc」の部分と「::」の最初の出現を取得し、それをすべてまとめて 1 つの文字列に戻す必要があります。爆発を 2 回連続して行うのではなく、1 ステップで行うことはできますか?
使用する文字列の例:
$str="12345:hello abcdef123:test,demo::example::12345";
および目的の部分文字列
$substr = "abcdef123:test,demo::"
次のように実行できます。
preg_match('~\s\Kabc\S+?::~', $str , $match);
$result = $match[0];
またはより明確な方法で
preg_match('~\s\Kabc\w*+:\w++(?>,\w++)*+::~', $str , $match);
$result = $match[0];
説明:
最初のパターン:
~ : delimiter of the pattern
\s : any space or tab or newline (something blank)
\K : forget all that you have matched before
abc : your prefix
\S+? : all chars that are not in \s one or more time (+) without greed (?)
: (must not eat the :: after)
~ : ending delimiter
2番目のパターン:
begin like the first
\w*+ : any chars in [a-zA-Z0-9] zero or more time with greed (*) and the
: RE engine don't backtrack when fail (+)
: (make the previous quantifier * "possessive")
":" : like in the string
\w++ : same as previous but one or more time
(?> )*+ : atomic non capturing group (no backtrack inside) zero or more time
: with greed and possessive *+ (no backtrack)
"::" : like in the string
~ : ending delimiter
もっと良い方法があるかもしれませんが、私は下手なテニス選手がバックハンドを避けるように正規表現を避けているので...
<?php
list($trash,$keep)=explode('abc',$str);
$keep='abc'.$keep;
list($substring,$trash)=explode('::',$keep);
$substring.='::'; //only if you want to force the double colon on the end.
?>