【问题标题】:PHP preg_replace making regex optional?PHP preg_replace 使正则表达式可选?
【发布时间】:2011-04-11 21:49:27
【问题描述】:

我有一些我正在尝试解析的内容...

我有 html 并且在 html 中我想用自定义字符串替换我的所有 img 标签。现在我遇到的一个问题是一些内容进来了:图像标签在一个锚之间。

例如

<a href="link"><img></a>

以下代码我有工作......但我希望它是可选的,所以如果没有锚标签被 img 标签包围,是否有人有任何关于正则表达式的好资源或可以帮助我?

谢谢!

$content = preg_replace('#<a.*?>'.$image_tag.'</a>#i', "{$image_id}", $content);

【问题讨论】:

  • HTML 不是正则语言,因此不适合正则表达式。使用 DOM/HTML 解析器。它们使用简单。
  • 不再...所以真的应该为 regex-for-html-parsing 问题设置一个自动响应器。

标签: php regex parsing preg-replace


【解决方案1】:
  • 标记后的问号使该标记成为可选的。
  • 使用(?...) 对多个令牌进行分组(无需创建捕获组)。
  • 结合这些,(?...)? 使该组成为可选的。

所以你可以这样做:

$content = preg_replace('#(?:<a.*?>)?'.$image_tag.'(?:</a>)?#i',
                        "{$image_id}",
                        $content);

您可能还想查看不基于正则表达式的替代解决方案,例如使用 HTML 解析器。

【讨论】:

    【解决方案2】:

    有什么原因

    $content = preg_replace('#'.$image_tag.'#i', "{$image_id}", $content);
    

    不行吗?如果您的正则表达式中没有 ^ 和 $ 锚,它应该只在数据中的任何位置搜索 $image_tag,无论它是否被 标签包围。如果这不起作用,也许尝试:

    $content = preg_replace('#(<a.*?>)?'.$image_tag.'(</a>)?#i', "{$image_id}", $content);
    

    这使得 标签成为子模式,然后是 ? 修饰符(即子模式可能出现 0 或 1 次)

    【讨论】:

      猜你喜欢
      • 2011-05-20
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      • 1970-01-01
      相关资源
      最近更新 更多