2014-02-18 3 views
0

Я довольно новичок в PHP, и мне нужно вырезать строку в определенные разделы на основе значения, а не числа символов.Вырезать строку в разные разделы в PHP?

Я слышал о функции взрыва и подстроке, но я не знаю, как использовать ее для достижения того, чего я хочу.

Я получил строку вывода:
Name: example Email: [email protected] Website: http://examples.com/ Comment: this is where the comment goes, we can't use explode because there's lots of spaces here Another comment: this is another comment Some random info: this is more info...

Я хочу, чтобы отобразить эту информацию в отдельных строках для эстетических целей.

Есть ли способ вернуть слово после определенного слова, но перед другим конкретным словом?

+0

Вы знакомы с массивами? – MonkeyZeus

+0

@Haudegen со всем уважением, OP не может понять, как взорваться и подстроить прямо сейчас, и вы предлагаете REGEX? – MonkeyZeus

+0

Ха-ха, я знаю, что такое RegEx, но у меня нет понятия, как его использовать. Я также знаю, что делает подстрока, но это сокращение строки с количеством символов, я не ищу этого.Explode также не помогает, потому что у меня нет ничего, разделяющего разные части строки (например, name: name; email: email;) – user3313191

ответ

0

Используйте функции простой строки манипуляции, как этого & сделать ур жизнь простой ..

<?php 
     $strx='Name: example Email: [email protected] Website: http://example.com/'; 
     $str=stristr($strx,"Comment :",true);// Take all chars before 'Comments :' 
     $str= str_replace(": ",":",str); 
     $str = str_replace(" ","\n");   
     echo $str . '\n Comment : '. ; // Its 
     echo stristr($strx,"Comment :"); // Done 
?> 
+0

Спасибо, но это не то, чего я пытаюсь достичь ... – user3313191

0

Как правило, функция explode() является то, что вы ищете, но это не будет работать слишком хорошо на вашем примере, так как вы Отсутствуют некоторые уникальные символы для разделения. С чем-то вроде:

Name: example; Email: [email protected]; Website: http://example.com/ 

Вы можете, например, взорвать строку точкой с запятой. explode() tutorial

+0

Да, это проблема, нет уникального символа, и я не могу использовать пространство, потому что информационные поля содержат пробелы. – user3313191

+0

@ user3313191: 'explode()' не будет работать для этого случая. Вместо этого вы можете использовать 'preg_split()'. Взгляните на [мой ответ] (http://stackoverflow.com/a/21858534/1438393). –

0

Вот REGEX, который будет вытаскивать каждую часть, которую вы просите:

<?php 

$string = "Name: example Email: [email protected] Website: http://examples.com/ Comment: this is where the comment goes, we can't use explode because there's lots of spaces here Another comment: this is another comment Some random info: this is more info... "; 

$name = ''; 
$email = ''; 
$website = ''; 

if (preg_match('/^Name: ([-A-Z \'.]+) Email: ([[email protected]]+) Website: ([-A-Z0-9\/.:]+) /i', $string, $matches)) { 
    $name = $matches[1]; 
    $email = $matches[2]; 
    $website = $matches[3]; 
} 

print ' 
    Name: '.$name.' 
    Email: '.$email.' 
    Website: '.$website; 
+0

С обновленным вопросом - в конце есть блок «Комментарий:», поэтому, если вам нужно настроить этот RegExp соответственно (терминатор линии после того, как веб-сайт его убьет), но в противном случае да, если вам нужно манипулировать строками нет ничего лучше или более гибкого, чем регулярные выражения IMO. – CD001

+0

Отмечено. Я сделаю обновление. – Quixrick

0

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

$text = "Name: example Email: [email protected] Website: http://examples.com/ Comment: this is where the comment goes, we can't use explode because there's lots of spaces here Another comment: this is another comment Some random info: this is more info..."; 
$test = preg_split('/(?=[A-Z])/', $text); 
foreach($test AS $line){ 
    echo $line."<br />"; 
} 
3

Вы можете использовать регулярные выражения для достижения этой цели, при условии, что данная строка является всегда в обычном формате.

Использование preg_split() может служить основой:

$arr = preg_split('/(?=[A-Z])/', $str, -1, PREG_SPLIT_NO_EMPTY); 

Регулярное выражение разбивает данную строку в точке, непосредственно перед любой заглавной буквы, используя positive lookahead утверждение.

Если сделать print_r() на массив, вы можете увидеть следующий вывод:

Array 
(
    [0] => Name: example 
    [1] => Email: [email protected] 
    [2] => Website: http://examples.com/ 
    [3] => Comment: this is where the comment goes ... 
    [4] => Another comment: this is another comment 
    [5] => Some random info: this is more info... 
) 

Как вы получаете эту строку в первую очередь? Если это что-то под вашим контролем, то я сильно рекомендую использовать JSON или подобное для передачи данных. Это проще и менее багги - и вы можете быть уверены, что он работает.

+0

+1 для простоты. Мне было интересно, если бы содержимое значения (которое принимало значение key: value) имело характер капитала, как изменилось бы изменение регулярного выражения? Я имею в виду что-то вроде этого - «Name: Example». Есть ли способ сделать это с помощью split? – Kamehameha

+0

@Yeah: Интересная проблема. Я постараюсь найти решение! Дай мне пару минут. –

+1

@Yeah: Что-то вроде этого должно работать '(? = [A-Z] [a-z] + \ s *: \ s *)'. Смотрите демонстрацию: https://eval.in/102804 –

2

Это работает -

$regex = "/[A-Z][^A-Z]*?\:\s.*?(?(?=[A-Z][^A-Z]*?\:)|$)/"; 
$string = "Name: Example Email: [email protected] Website: http://examples.com/ Comment: this is where the comment goes, we can't use explode Because there's Lots of spaces here Another comment: this is another comment Some random info: this is more info"; 
if(preg_match_all($regex, $string, $matches)){ 
    var_dump($matches[0]); 
} 
/* 
OUTPUT 
array 
    0 => string 'Name: Example ' (length=14) 
    1 => string 'Email: [email protected] ' (length=23) 
    2 => string 'Website: http://examples.com/ ' (length=30) 
    3 => string 'Comment: this is where the comment goes, we can't use explode Because there's Lots of spaces here ' (length=98) 
    4 => string 'Another comment: this is another comment ' (length=41) 
    5 => string 'Some random info: this is more info' (length=35) 

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