我一直试图让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]
模式而不是{#}。我尝试在我的模式中添加行开始^
和结束$
。我被卡住了。我知道这最终会变得简单,我只是忽略了。这就是为什么我需要一些新的眼睛。
答案 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);