如何根据分隔符“|”之前的匹配值获取字符串中的第二个值?
Posted
技术标签:
【中文标题】如何根据分隔符“|”之前的匹配值获取字符串中的第二个值?【英文标题】:How to fetch second value in string based on the matched value before the delimeter "|"? 【发布时间】:2022-01-19 19:47:00 【问题描述】:如何根据分隔符“|”前的匹配值获取字符串中的第二个值?
期望的输出:
12348888
113336669998888
基于搜索值:1254698
<?php
$contents = '12345|BHKAHHHHkk
1254698|12348888
12345|BHKNe22223366
1254698|113336669998888
012250000|22154545488888';
$searchfor = '1254698';
if(preg_match('/(?:\n|^)' . $searchfor . '\|([^|]+)(.*?)(?:\r?\n|$)/is', $contents, $matchs))
$second_value = $matchs[1];
$reset_values = $matchs[2];
echo "Result for searching <b>$searchfor</b> is <b>$second_value</b> and reset of data is <b>$reset_values</b>";
else echo('Not Found :(');
?>
【问题讨论】:
【参考方案1】:你可以使用
<?php
$contents = '12345|BHKAHHHHkk
1254698|12348888
12345|BHKNe22223366
1254698|113336669998888
012250000|22154545488888';
$searchfor = '1254698';
if(preg_match_all('/^' . $searchfor . '\|([^|\r\n]+)/m', $contents, $matchs))
print_r($matchs[1]);
else
echo('Not Found :(');
请参阅online PHP demo。输出:
Array
(
[0] => 12348888
[1] => 113336669998888
)
正则表达式是/^$searchfor\|([^|\r\n]+)/m
,注意m
标志使^
匹配任何行的开头。模式匹配
^
- 行首
$searchfor
- 搜索到的值
\|
- 文字 |
char
([^|\r\n]+)
- 除了|
、CR 和 LF 字符之外的一个或多个字符。
请参阅 regex demo。此外,在 regex101.com 进行测试时,您始终可以使用
获取为您生成的代码的链接。
【讨论】:
【参考方案2】:不要使用正则表达式,使用循环并在|
个字符处分割每一行。
$lines = file($input_file, FILE_IGNORE_NEW_LINE)
$found = false;
foreach ($lines as $line)
[$first_value, $second_value, $reset_values] = explode('|', $line, 3);
if ($cols[0] == $searchfor)
echo "Result for searching <b>$searchfor</b> is <b>$second_value</b> and reset of data is <b>$reset_values</b>";
$found = true;
if (!$found)
echo 'Not Found :(';
【讨论】:
感谢您的帮助。我尝试运行代码,但出现未定义的数组错误: [$first_value, $second_value, $reset_values] = explode('|', $line, 3); 你有空行吗?添加FILE_SKIP_EMPTY_LINES
标志。
什么版本的 PHP?你可能需要写list($first_value, $second_value, $reset_values) = ...
我使用的是 php 7.3
那么它可能是空行,添加那个标志:FILE_IGNORE_NEW_LINE | FILE_SKIP_EMPTY_LINES
以上是关于如何根据分隔符“|”之前的匹配值获取字符串中的第二个值?的主要内容,如果未能解决你的问题,请参考以下文章