如何将 foreach 循环中的字符串与 PHP 中的 preg_split 匹配

How to match String in foreach loop with preg_split in PHP

我有 2 个部分的数据,使用此分隔符 |

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

我的静态词是$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

您可以使用单个正则表达式方法:

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

regex demo

详情

  • ^ - 行首(由于 m 修饰符)
  • \h* - 0+ 水平空格
  • price - 你的静态词
  • \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];
}

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