【问题标题】:Negative lookahead to parse HTML解析 HTML 的负前瞻
【发布时间】:2016-12-16 07:36:41
【问题描述】:

我有一个这样的模式:

/<img([^>]*?)(?!\sdata-src=([\'\"])[\S\h\v]*?\2)\ssrc=([\'\"])([\S\h\v]*?)\3/igm

这就是我想要实现的目标:

<img src="test'"/> # this should be matched, and it is
<img data-src="abc" src="abc"/> # this one shouldn't be matched, but it is

我不明白为什么我的负前瞻不起作用 - 如您所见,我不希望 data-src 参数出现在 src 参数之前。

为了测试我的表达式,我使用了 regex101,我的例子就是基于它。我将在 PHP 中使用该正则表达式。

为了满足 PHP 社区:

$html = '<img src="test\'"/><img data-src="abc" src="abc"/>';
$html = preg_replace('/<img([^>]*?)(?!\sdata-src=([\'\"])[\S\h\v]*?\2)\ssrc=([\'\"])([\S\h\v]*?)\3/i', '<img$1 data-src=$3$4$3 src=$3placeholder$3', $html);
echo $html;
>>> <img data-src="test'" src="placeholder"/><img data-src="abc" src="abc"/>

【问题讨论】:

  • 请显示您的实际输入以及预期输出。并且正则表达式不是解析 HTML 的正确工具
  • @NarendrasinghSisodia 如果您希望我使用 DOMDocument 或其他东西,我会简单地说 - 不。我不能依赖 libxml。

标签: php regex negative-lookbehind


【解决方案1】:

你的([^&gt;]*?) 搞砸了。试试吧。

<img (?!data-src=['"])[^>]*?src=(['"])(.*?)\1

https://regex101.com/r/wKQk4p/1

【讨论】:

  • 但是当src之前有其他参数时它不起作用(甚至不正确),这就是我将([^&gt;]*?)放在那里的原因
猜你喜欢
  • 2013-04-13
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
相关资源
最近更新 更多