Как сопоставить строку в foreach l oop с preg_split в PHP - PullRequest
2 голосов
/ 02 февраля 2020

У меня есть данные с 2-мя частями с этим разделителем |

$data = 'hello | Hello there
price | Lets talk about our support.
how are you ?| Im fine ';

И мои данные c слово $word= 'price'

Мой код

 $msg = array_filter(array_map('trim', explode("\n", $data)));
 foreach ($msg as $singleLine) {
            $partition = preg_split("/[|]+/", trim($singleLine), '2');
            $part1 = strtolower($partition[0]);

            }

Как сопоставить данные? Мне нужно, чтобы результат был таким: Let's talk about our support

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Вы можете использовать один подход регулярных выражений:

'~^\h*price\h*\|\h*\K.*\S~m'

См. Демонстрационную версию регулярных выражений

Подробности

  • ^ - начало строки (из-за модификатора m)
  • \h* - 0+ горизонтальный пробел
  • price - ваши данные c слово
  • \h*\|\h* - |, заключенный в 0+ горизонтальных пробелов
  • \K - оператор сброса совпадений, который отбрасывает сопоставленный текст
  • .*\S - 0+ символов кроме символов разрыва строки, как можно больше, вплоть до последнего непробельного символа в строке (включая его).

PHP code :

if (preg_match('~^\h*' . preg_quote($word, '~') . '\h*\|\h*\K.*\S~m', $data, $match)) {
    echo $match[0];
}
0 голосов
/ 03 февраля 2020

Ответ Wiktor кажется хорошим, но вы можете захотеть превратить ваши данные в массив key -> value.

В этом случае вы можете сделать следующее:

$avp = [];
if (preg_match_all('/^ \h* (?<key>[^|]+?) \h* \| \h* (?<value>[^$]+?) \h* $/mx', $data, $matches, PREG_SET_ORDER)) {
  foreach ($matches as [, $key, $value]) {
    $avp[$key] = $value;
  }
}

$word = 'price';
echo $avp[$word];  // Lets talk about our support.

Демонстрация: https://3v4l.org/uMBAg

...