1

我一直试图让 PHP preg_replace 正常工作。我想找到一个模式的所有匹配项并将它们替换为一个字符串。但是,由于某种原因,它只找到部分匹配项并替换所有匹配项。我正在尝试从文本文件的每一行中删除“密码”。密码始终位于每行的末尾,包含 4 到 8 个字母数字字符,并且始终跟在两个竖线字符之后。

例子:

$data = 'A00000001|A00000001|FirstName|LastName|email@address|Role||password'.PHP_EOL;
$data .= 'B00000002|B00000002|FirstName|LastName|email@address|Role||password'.PHP_EOL;
$delim = '|';

$newData = preg_replace("/".$delim.$delim."[a-zA-Z0-9]{4,8}/", $delim.$delim, $data);
echo $newData;

输出:

||||||1|||||||||1|||||||||e||||||||||||e||m||a||i| |l||@||a||d||d||r||e||s||s|||||R||o||l||e||||||||| ||| ||||||2|||||||||2|||||||||e||||||||||||e||m||a||i| |l||@||a||d||d||r||e||s||s|||||R||o||l||e||||||||| ||| ||

我使用括号尝试了许多不同分组的变体,将背靠背[a-zA-Z0-9]模式而不是 {#}。我试过在我的模式中添加行开始^和结束。$我被困住了。我知道这最终会变得很简单,我只是忽略了。这就是为什么我需要一些新的眼光。

4

3 回答 3

3

你应该使用这个正则表达式

/(?<=\|\|)[a-zA-Z]{4,8}$/

您需要转义|,因为它代表正则表达式中的 OR

$标记字符串的结尾

(?<=\|\|)是一个零宽度的lookbehind

于 2013-06-26T15:41:54.100 回答
0

我正在尝试从文本文件的每一行中删除“密码”。

在这种情况下,请在正确转义分隔符后锚定正则表达式。假设也不应该保留分隔符,您可以使用:

preg_replace('/\|.*?$/', '', $data);

如果应该,请使用后视或:

preg_replace('/\|.*?$/', '|', $data);

单独说明:这看起来像 SQL 转储或 CSV 文件。如果是这样,请考虑使用COPY ... DELIMITER ...RDBMS 提供的任何变体:

http://www.postgresql.org/docs/current/static/sql-copy.html

然后,您可以创建一个临时表、导入、删除列、执行您需要执行的任何其他操作,并在完成后根据需要填充最终表。

于 2013-06-26T15:48:16.717 回答
0

看起来你可以逃避你的分隔符。

$newData = preg_replace('/\'.$delim.'\'.$delim.'[a-zA-Z0-9]{4,8}/', $delim.$delim, $data);
于 2013-06-26T15:48:59.350 回答