将长正则表达式拆分成碎片 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;
仍然在循环内部打印,但不在循环外部打印。
问题其实出在数据库记录上。其中一条记录中有斜线
我有一个很长的名字列表,我使用 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;
仍然在循环内部打印,但不在循环外部打印。
问题其实出在数据库记录上。其中一条记录中有斜线