首页 > 解决方案 > 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。

标签: phpregexpattern-matching

解决方案


您可以通过在搜索字符串的任一侧查找 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.

3v4l.org 上的演示


推荐阅读