【问题标题】:preg_match_all of specific length before and after the pattern matchpreg_match_all 在模式匹配之前和之后的特定长度
【发布时间】:2018-10-26 08:19:02
【问题描述】:

我有一个代码可以从一大段字符串中找到与模式匹配的完整行。

$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}I have.{10})
  • 您只需将捕获组添加到您的正则表达式。例如"aaa(\d{4})bbb" 只会匹配“aaa”和“bbb”之间的 4 位数字。

标签: php regex pattern-matching


【解决方案1】:

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

Demo on 3v4l.org

【讨论】:

  • 太棒了!谢谢。
猜你喜欢
  • 2017-09-16
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
相关资源
最近更新 更多