2014-09-05 2 views
1

У меня есть контент.сплит и слияние содержимого

{this is title1|this is title2} 
{this is para11|this is para21} 
{this is para12|this is para22} 
{this is para13|this is para23} 

Я хочу отделить их как два содержания.

Содержание 1:

this is title 
this is para11 
this is para12 
this is para13 

содержание 2:

this is title 
this is para21 
this is para22 
this is para23 

Я попытался, по крайней мере, чтобы получить 1-го содержания в массиве, но он не приходит.

function findinside($start, $end, $string) { 
    preg_match_all('/' . preg_quote($start, '/') . '([^\.)]+)'. preg_quote($end, '/').'/i', $string, $m); 
    return $m[1]; 
} 
$content = "{this is title1|this is title2} 

{this is para11|this is para21} 

{this is para12|this is para22} 

{this is para13|this is para23}"; 
$start_string = '{'; 
$stop_string = '|'; 
$strings = findinside($start_string,$stop_string,$content); 
echo '<pre>'; 
print_r($strings); 
echo '</pre>'; 

Выход:

Array 
(
[0] => this is title1|this is title2} 

{this is para11|this is para21} 

{this is para12|this is para22} 

{this is para13 
) 

Может кто-то помощь для 2 контента. Также, если это будет более 2-х контента. Сейчас я ищу 2 контента. Но если он работает для n контента, который был бы идеальным. Спасибо

+1

Взорваться по разрыву, петле, взорваться трубой – 2014-09-05 02:38:12

ответ

1

Это должно работать:

<?php 
$content = "{this is title1|this is title2} 

{this is para11|this is para21} 

{this is para12|this is 
para22} 

{this is para13|this is para23}{this is para14|this is para24} 


{this is 
para14|this is para24}"; 
#$c = array_values(array_filter(explode(PHP_EOL, $content))); 
#$c = explode("}{", str_replace(array("}\r", "}\n"), "}", substr($content, 1, -1))); 
$c = preg_split("#}\s*{#", substr($content, 1, -1)); 
$a = array(); 
foreach($c as $cc){ 
    $t = explode('|', $cc); 
    foreach($t as $k => $v){ 
     $a[$k][] = $t[$k]; 
    } 
} 
var_dump($a[0], $a[1]);#depending on how many items access them by $a[n] 
+0

дает пустой массив, т.е. (логическое значение false) для каждого пространства между каждой строкой. 0 => string 'this is title1' (length = 14) 1 => boolean false 2 => строка 'this is para11' (length = 14) – user2986104

+0

не дает правильного результата, если} {находятся рядом. – user2986104

+0

$ content = "{this is title1 | this title2} {Пока вы можете получить отличную ставку. Проверяйте отзывы в Интернете перед тем, как нанять новую компанию.} {это para13 | это para23}; Возвращает: array (size = 1) 0 => string 'this is title1' (length = 14) array (size = 1) 0 => string ' это title2} {Хотя вы можете получить отличную ставку. (длина = 63) Неполные данные и} {не разбиты. – user2986104

0

Ваш класс персонажа должен исключить $end, потому что кванторы являются жадными, и он будет пытаться соответствовать всем последним символам, а не первым.

function findinside($start, $end, $string) { 
    preg_match_all('/' . preg_quote($start, '/') . '([^\.)' . preg_quote($end) . ']+)'. preg_quote($end, '/').'/i', $string, $m); 
    return $m[1]; 
} 
+0

работает идеально. Можете ли вы также предложить мне какую-то идею, если мне нужно на n количество контента. – user2986104

+0

Но это не работает в моем реальном содержании. Я не знаю почему. я сократил 2-й пункт реального контента. отображается только первый и последний параграфы. $ содержание = «{это title1 | это title2} {В то время как вы можете быть в состоянии получить большую скорость на |... Проверьте отзывы на сайте Перед тем как нанять любого нового чистки ковров компании } { это пара13 | это пара23} »; – user2986104

+0

Поскольку шаблон настолько регулярный, почему бы вам не разбить его на строки с 'explode (" \ n ", $ content)', удалите фигурные скобки с концов строк, а затем разделите каждую строку на 'explode (' | ', $ line) '. – Barmar

0

Попробуйте это:

$res = preg_split('/\||\}.*\{/Us', substr($content, 1, -1)); 
for($i=0,$n=1,$l=count($res); $n<$l; $i+=2,$n+=2){ 
    $content_1[] = $res[$i]; $content_2[] = $res[$n]; 
} 
+0

Не возвращает весь контент. Вам нужно поставить 1 вместо l in for loop и $ content_1 returns => Array ([0] => this title1) и $ content_2 returns => Array ([0] => это title2} {это para11) – user2986104

+0

Я думаю, что это работает сейчас. – PHPglue

0
function findinside($start, $end, $middle, $string) { 
    $prepare = array(); 
    $result = array('content_1' => array(), 'content_2' => array()); 

    $rc = (bool)preg_match_all("/".$start."(.*?)".$end."/", $string, $prepare); 
    if($rc){ 
     foreach ($prepare[1] as $str){ 
      list($c1, $c2) = explode($middle, $str); 
      $result['content_1'][] = $c1; 
      $result['content_2'][] = $c2; 
     } 
    } 

    return $result; 
} 

Вызывается:

$strings = findinside('{', '}', '|', $content); 

echo '<pre>'; 
print_r($strings); 
echo '</pre>'; 

Выход:

Array 
(
[content_1] => Array 
    (
     [0] => this is title1 
     [1] => this is para11 
     [2] => this is para12 
     [3] => this is para13 
    ) 
[content_2] => Array 
    (
     [0] => this is title2 
     [1] => this is para21 
     [2] => this is para22 
     [3] => this is para23 
    ) 
) 
+0

не соответствует правильному результату, если {} рядом. $ content = "{this is title1 | this title2} {это пара11 | это пара21} {это пара12 | это пара22} {это пара13 | это пара23} {это пара14 | это пара24} "; А также просто вернуть 3 абзаца и не вернуть весь абзац из реального контента. – user2986104

+0

Исправить regExp: ** $ rc = (bool) preg_match_all ("/".$ start." (. *?) ". $ End."/", $ String, $ prepare); ** –

+0

Я думаю, если сепаратор | находится в следующей строке, тогда она ускользает от нее. Эти параграфы отсутствуют на выходе. – user2986104

Смежные вопросы