如何将 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'
详情
^
- 行首(由于 m
修饰符)
\h*
- 0+ 水平空格
price
- 你的静态词
\h*\|\h*
- |
包含 0+ 个水平空格
\K
- 丢弃到目前为止匹配的文本的匹配重置运算符
.*\S
- 除换行符外的 0+ 个字符,尽可能多,直到该行的最后一个非空白字符(包括它)。
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.
我有 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'
详情
^
- 行首(由于m
修饰符)\h*
- 0+ 水平空格price
- 你的静态词\h*\|\h*
-|
包含 0+ 个水平空格\K
- 丢弃到目前为止匹配的文本的匹配重置运算符.*\S
- 除换行符外的 0+ 个字符,尽可能多,直到该行的最后一个非空白字符(包括它)。
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.