【问题标题】:Including brackets in the preg_replace function在 preg_replace 函数中包含括号
【发布时间】:2022-01-02 07:31:13
【问题描述】:

我正在尝试做一个合适的替换功能

我有以下代码来删除摘录中的所有 URL: return preg_replace( '/\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i', '', $excerpt );

但是,URL 出现在括号中,即 (https://imperium...)

所以,还有left()

我应该如何调整代码以删除括号?

感谢您的帮助。 问候, 雅库布

【问题讨论】:

  • 我真的不喜欢增加给定 RegEx 的复杂性,除非我真的需要。我会将替换从一个空字符串更改为您希望永远不会在您的 cmets 中找到的符号,例如 %URL%。然后使用该已知符号执行第二遍,该符号也查找括号、括号等,并删除它们。印记可以是任何东西,我只是快速挑选了一些东西。
  • 谢谢克里斯。但是我不确定我是否理解代码应该是什么样的。能否请您给我打个电话澄清一下?

标签: php regex


【解决方案1】:

这是一个两遍的版本。我完全按原样保留了原来的 RegEx,只是假设它对你有用。

我没有使用'' 删除该值,而是将其替换为!!URL!!。无论如何,该字符串不一定是特殊的,除非我假设它永远不会存在于原始文本中。它可以是任何东西,%CHEESE%8675309,甚至是 GUID。格式甚至无关紧要,但我通常会在其周围添加一些特殊的东西,例如感叹号或百分号,以使其更不可能发生冲突。

然后第二遍查找那个特殊的字符串,可以选择用括号括起来。您也可以在那里添加一些额外的括号测试。并且preq_quote 保证无论特殊字符串是什么,它都会自动为 RegEx 正确转义。

function removeUrl(string $string): string
{
    $sigil = '!!URL!!';
    $pass1 = preg_replace('/\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i', $sigil, $string);
    $pass2 = preg_replace('/\(?'.preg_quote($sigil, '/').'\)?/', '', $pass1);

    return $pass2;
}

$data = <<<EOT
Lorem ipsum (https://example.com) lorem ipsum https://example.net
EOT;

var_dump(removeUrl($data));

在这里演示:https://3v4l.org/muTGF

【讨论】:

  • 谢谢。将调整我的代码并让您知道是否有帮助!
猜你喜欢
  • 2010-10-16
  • 2014-06-15
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
相关资源
最近更新 更多