【问题标题】:PHP preg_replace is not matching entire patternPHP preg_replace 不匹配整个模式
【发布时间】:2013-06-26 15:40:06
【问题描述】:

我一直试图让 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] 模式而不是{#} 背靠背放置。我尝试在我的模式中添加行开始^ 和结束$。我被困住了。我知道这最终会变得很简单,我只是忽略了。这就是为什么我需要重新审视这个问题。

【问题讨论】:

标签: regex preg-replace


【解决方案1】:

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

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

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

$ 标记字符串的结尾

(?&lt;=\|\|)zero width lookbehind

【讨论】:

  • 当我使用你的正则表达式模式时,它只删除了第二行的“密码”。我假设这是由于后视部分。你对逃离管道是正确的。我知道这会很简单。谢谢。
【解决方案2】:

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

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

【讨论】:

  • 完美,谢谢。虽然,我不得不在我的双引号代码中使用双转义:$newData = preg_replace("/\\".$delim."\\".$delim."[a-zA-Z0-9]{4,8}/", $delim.$delim, $data);
【解决方案3】:

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

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

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

如果需要,请使用后视或:

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

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

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

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

【讨论】:

  • 谢谢丹尼斯。我通过转义管道字符来修复它。这是在操作一个 csv 文件,我无法控制它的制作方式。这是一个临时修复,直到它可以在另一方正确修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多