Разрезать строку на разные разделы в PHP?

0

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

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

У меня есть строка вывода:
Name: example Email: [email protected] Website: http://examples.com/Comment: this is where the comment goes, we can't use explode because there lots of spaces here Another comment: this is another comment Some random info: this is more info...

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

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

  • 0
    Вы знакомы с массивами?
  • 0
    @ Хаудеген при всем моем уважении, OP не может понять, как взорваться и подстрока прямо сейчас, и вы предлагаете REGEX?
Показать ещё 3 комментария
Теги:
function

6 ответов

3

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

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

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

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

Если мы сделаем 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 для простоты. Мне было интересно, если содержимое значения (то есть предполагается, что ключ: значение) имеет заглавный символ, как изменится регулярное выражение расщепления? Я имею в виду что-то вроде этого - «Имя: Пример». Есть ли способ сделать это с помощью split?
  • 0
    @ Да: интересная проблема. Я постараюсь найти решение! Дай мне пару минут.
Показать ещё 2 комментария
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 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 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)

*/
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 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 />";
}
0

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

<?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
    Спасибо, но это не то, чего я пытаюсь достичь ...
0

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

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

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

  • 0
    Да, это проблема, нет уникального символа, и я не могу использовать пробел, потому что информационные поля содержат пробелы.
  • 0
    @ user3313191: explode explode() не будет работать для этого случая. Вместо этого вы можете использовать preg_split() . Посмотрите на мой ответ .
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 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: ([-A-Z0-9_@.]+) Website: ([-A-Z0-9\/.:]+) /i', $string, $matches)) {
    $name = $matches[1];
    $email = $matches[2];
    $website = $matches[3];
}

print '
    Name: '.$name.'
    Email: '.$email.'
    Website: '.$website;
  • 0
    С обновленным вопросом - в конце есть блок Comment: так что если вам нужно соответствующим образом настроить RegExp (терминатор строки после того, как веб-сайт убьет его) - но в противном случае, да, если вам нужно манипулировать строками, нет ничего лучше или более гибкий, чем регулярные выражения IMO.
  • 0
    Отметил. Я сделаю обновление.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню