将长正则表达式拆分成碎片 PHP

splitting long regex to pieces PHP

我有一个很长的名字列表,我使用 preg_replace 来匹配列表中的名字是否在字符串中的任何位置。如果我在正则表达式中用几个名字测试它,它工作正常,但考虑到我有超过 5000 个名字,它给我错误“preg_replace():编译失败:正则表达式太大”。

不知怎么的,我不知道如何将正则表达式拆分成多个部分以使其变得更小(如果可能的话)。

名称列表是从数据库动态创建的。 这是我的代码。

$query_gdpr_names = "select name FROM gdpr_names";
$result_gdpr_names = mysqli_query($connect, $query_gdpr_names);
    
while ($row_gdpr_names = mysqli_fetch_assoc($result_gdpr_names))
{
  $AllNames .= '"/'.$row_gdpr_names['name'].'\b/ui",';
}
$AllNames = rtrim($AllNames, ',');
$AllNames = "[$AllNames]";
$search = preg_replace($AllNames, '****', $search);

创建的 $AllNames str 看起来像这样(示例中只有 3 个名称)

$AllNames = ["/Lola/ui", "/Monica\b/ui", "/Chris\b/ui"];

和测试字符串

$search = "I am Lola and my friend name is Chris";

非常感谢任何帮助。

由于您似乎无法使用单个正则表达式交替轻松处理来自 PHP 的替换,因此一种替代方法是逐个迭代结果集中的每个名称并进行替换:

while ($row_gdpr_names = mysqli_fetch_assoc($result_gdpr_names)) {
    $name = $row_gdpr_names['name'];
    $regex = "/\b" . $name . "\b/ui";
    $search = preg_replace($regex, '----', $search);
}

$search = preg_replace("/----/", '****', $search);

这不是执行此操作的最有效模式。也许有一些方法可以限制您的结果集以避免太长的单次交替。

好的,我调试了很多。甚至隔离除这部分代码之外的所有其他内容

$search = "Lola and Chris";
        $query_gdpr_names = "select * FROM gdpr_names";
            $result_gdpr_names = mysqli_query($connect, $query_gdpr_names);
                    while ($row_gdpr_names = mysqli_fetch_assoc($result_gdpr_names)) {
                        $name = $row_gdpr_names['name'];
                        $regex = "/\b" . $name . "\b/ui";
                        $search = preg_replace($regex, '****', $search);
                        
                    }
                echo $search;

仍然在循环内部打印,但不在循环外部打印。

问题其实出在数据库记录上。其中一条记录中有斜线