【问题标题】:preg_replace usage or alternativepreg_replace 使用或替代
【发布时间】:2011-12-05 20:19:19
【问题描述】:

所以我需要过滤/替换 PHP 中的文本以确保破折号周围有空格。

示例:“衬衫 - 通用”需要变为“衬衫 - 通用” 但我不想要额外的空格,所以“衬衫 - 通用”确实会更改为“衬衫 - 通用”(破折号的每一侧都有 2 个空格。

破折号的每一侧总会有一个空格或文本。

现在我正在使用以下代码,它可以工作,但需要很长时间(我正在使用这段代码检查大约 900,000 个变量)。当我添加这个时,我的脚本从 4 分钟变为 52 分钟。

$myText = preg_replace("/(.)(-)(.)/", "$1 - $3", $myText);

想法?

【问题讨论】:

  • 不知道,在您的情况下,“条目”是什么,但“从 4 分钟到 52 分钟”听起来,它的作用远不止这个简单的替换。
  • 我的脚本做得更多,但这是一直占用的部分。我认为我使用 preg_replace 的方式并不是实现我需要的最佳方式,但我一直无法找到更好的选择。
  • @EricImprint 我还在我的答案中添加了一个非正则表达式解决方案。我很想找到一个性能更快的。

标签: php preg-replace


【解决方案1】:

以下应该更快:

preg_replace("/ ?- ?/", " - ", $txt);

这是一个变体,只有一次调用 str_replace:

str_replace(array(' -', '- ', ' - ', '-'), array('-', '-', '-', ' - '), $txt);

这是一个同时工作的例子:http://codepad.org/zqf4LRVD

我懒得做性能比较,但我很想知道哪个更快。

【讨论】:

  • 谢谢。我认为双 str_replace 选项更适合。
  • 实际上只进行一次 str_replace 调用会更快,唯一的区别是如果您只使用 2 个元素或使用 4 个元素,就像我写的那样。如果你不能只在一侧有空格,你可以简化数组。
  • 无论如何,我试图确保破折号的每一侧只有一个空格和一个空格。我会试试你的数组版本,让你知道它是否比调用两个 str_replace 更快。
  • 我刚刚进行了测试,我知道您的第二个解决方案是最快的。您还可以通过删除 2 个测试来加快速度:str_replace(array(' - ', '-'), array('-', ' - '), $txt);,因为每边只有 1 个空格或没有空格。
  • 带有 4 部分数组的 str_replace 最终比 preg_replace 快 20%。 (我的数据)
【解决方案2】:

这应该更快:preg_replace( "/\\s*-\\s*/", " - ", $myText );

【讨论】:

  • 谢谢。我认为双 str_replace 选项更适合。
  • 正如 draevor 指出的那样,如果一侧只有空格,thelastshadow 的响应将不起作用。如果有多个空间,它也将不起作用。这会处理这两种情况。
【解决方案3】:

我认为这会尽快完成。你可以试试双 str_replace

$once = str_replace("-", " - ", $content);
$twice = str_replace("  -  ", " - ", $once);

这显然只有在您不担心开头有双空格时才有效

【讨论】:

  • 或者,如果您只有一侧有空格 - 在这种情况下,您将不得不进行 4 次替换。
  • 有时最好的答案是简单的。谢谢。我的自我只是因为没有想到这一点而受到打击。我会更新我的脚本,让你知道它是怎么回事。
  • 确实如此。 preg_replace 真的是你在这里所追求的,除非你知道你必须从什么开始。
  • 我确实知道我要输入什么,它将是 text-text 或 text-text,所以这应该可以。
猜你喜欢
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 2013-12-09
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
相关资源
最近更新 更多