PHP preg_replace与整个模式不匹配

时间:2013-06-26 15:40:07

标签: regex preg-replace

我一直试图让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 |||||||||Ë|||||||||Ë|||||||||||| || ||米一个| | I || ||升@ || ||一个|| d || d ||řË|| ||小号小号||||| ||řø|| ||升è|||||| ||||||   |||||| 2 ||||||||| 2 |||||||||ë||||||||||||Ë|| ||米一个|| I | | L || @ || ||一个|| d || d ||řË|| ||小号小号||||| ||řø|| ||升è||||||||| |||   ||

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

3 个答案:

答案 0 :(得分:3)

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

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

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

$标记字符串

的结尾

(?<=\|\|)zero width lookbehind

答案 1 :(得分:0)

  

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

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

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

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

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

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

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

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

答案 2 :(得分:0)

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

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