Вы можете сделать это следующим образом:
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
второй схеме:
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
Exp loding с 2 разделителями может быть выполнено с помощью 'preg_split()': '$ sub = preg_split (', |:', $ str);', но желаемый результат для меня не имеет смысла. Можете ли вы объяснить логику этого? – HamZa
Данные представляют собой сложный массив из Wordpress db. Мне нужно извлечь часть его, отредактировать данные и обновить db новыми данными. Единственный способ, которым я могу это сделать, - разбить строку, отредактировать «среднюю» часть и объединить ее обратно. – bikey77
Итак, разделители ':' и вы хотите «остановить» на '::' и получить 'xxx: yyy ::' value? – HamZa