2013-04-30 1 views
0

В следующей строке $str Мне нужно взорвать/разделить данные, получить часть 'abc' и сначала появление '::', а затем взорвать все это вместе одиночная строка. Может ли взорваться сделать за один шаг вместо двух последовательных взрывов?PHP взрывается/разделяется с помощью двух разных разделителей

Пример строки для работы с:

$str="12345:hello abcdef123:test,demo::example::12345"; 

и желаемая подстрока

$substr = "abcdef123:test,demo::" 
+0

Exp loding с 2 разделителями может быть выполнено с помощью 'preg_split()': '$ sub = preg_split (', |:', $ str);', но желаемый результат для меня не имеет смысла. Можете ли вы объяснить логику этого? – HamZa

+0

Данные представляют собой сложный массив из Wordpress db. Мне нужно извлечь часть его, отредактировать данные и обновить db новыми данными. Единственный способ, которым я могу это сделать, - разбить строку, отредактировать «среднюю» часть и объединить ее обратно. – bikey77

+0

Итак, разделители ':' и вы хотите «остановить» на '::' и получить 'xxx: yyy ::' value? – HamZa

ответ

1

Вы можете сделать это следующим образом:

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 
+0

@ bikey77: Я отредактировал свой ответ с префиксом abc –

+0

Я ужасен, когда дело доходит до регулярных выражений. Это то, что я получаю: 'Предупреждение: preg_match() [function.preg-match]: Нет окончательного разделителя '~' found' – bikey77

+0

@ bikey77: я забыл окончание ~. Oops –

0

Существует, вероятно, лучший способ, но так как я избегаю регулярное выражение, как плохой теннисиста избегает их наотмашь .. .

<?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. 
?> 
+0

Я отредактировал свою строку примера, чтобы было ясно, что обычно не будет :: перед abc. – bikey77

+0

Будет ли всегда начинаться с "abc"? – TecBrat

+0

да, это всегда будет. – bikey77