php - preg_match_all 在模式匹配之前和之后的特定长度
问题描述
我有一个代码可以从一大段字符串中找到与模式匹配的完整行。
$searchfor = 'some unicode words';
$pattern = preg_quote($searchfor, '/');
$pattern = "/^.*$pattern.*\$/m";
if(preg_match_all($pattern, $chunk, $matches)){
echo "Found matches:\n";
echo implode("\n", $matches[0]);
}
但是,我不想要与搜索词匹配的完整行。我需要那个词加上针前后的 10 个字符。请参阅以下示例以更好地理解。
源语句:
这是我一生中见过的非常大的文本行,我喜欢它。
针:
我有
输出:
我见过的文本行
(前后各10个字的针)
如何更改将支持上述标准的模式。
TIA。
解决方案
您可以通过在搜索字符串的任一侧查找 10 个字符并将它们与搜索字符串分组来修改模式:
/^.*?(.{1,10}$pattern.{1,10}).*$/
请注意,我们使用{1,10}
而不是{10}
因为如果在源的开头或结尾附近找到搜索字符串,我们可能没有 10 个字符可用于填充匹配。这里有些例子:
$chunk = 'This is a very large text line I have ever seen in my life and I love it.';
$searchfor = 'I have';
$pattern = preg_quote($searchfor, '/');
$pattern = "/^.*?(.{1,10}$pattern.{1,10}).*$/m";
if(preg_match_all($pattern, $chunk, $matches)){
echo "Found matches:\n";
echo implode("\n", $matches[1]) . "\n";
}
$searchfor = 'a very';
$pattern = preg_quote($searchfor, '/');
$pattern = "/^.*?(.{1,10}$pattern.{1,10}).*$/m";
if(preg_match_all($pattern, $chunk, $matches)){
echo "Found matches:\n";
echo implode("\n", $matches[1]) . "\n";
}
$searchfor = 'and I';
$pattern = preg_quote($searchfor, '/');
$pattern = "/^.*?(.{1,10}$pattern.{1,10}).*$/m";
if(preg_match_all($pattern, $chunk, $matches)){
echo "Found matches:\n";
echo implode("\n", $matches[1]) . "\n";
}
输出
Found matches:
text line I have ever seen
Found matches:
This is a very large tex
Found matches:
n my life and I love it.
推荐阅读
- python - 用 requests.get 编写一个 get json 函数,而 json 文件是单引号的
- azure - Azure 门户配置中 Azure Key Vault Reference 不同图标颜色的含义是什么?
- java - 在 Selenium 中将类作为 TestNG 测试运行时出现 java.lang.StackOverflowError
- android - Android kotlin 对象到 json 值的顺序
- reactjs - 使 Material UI 网格在反应中水平滚动
- c# - Linq Lambda Expressin Where 条件和性能问题
- python - 关于如何在 python 中比较 h5 文件中的不同组的提示?
- java - 如何将 TarArchiveOutputStream 转换为字节数组而不保存到文件系统中
- javascript - 发送到子组件时的 Redux Toolkit 状态问题
- firebase - 未定义的类'UserUpdateInfo'