【问题标题】:Make this Regex work with negative lookahead使这个正则表达式与负前瞻一起工作
【发布时间】:2017-03-10 17:44:32
【问题描述】:

我正在做一个 html 和 bbcode 解析器。我有这个从内到外捕获重复组的正则表达式:

$re = '/<b>((?:(?!<\/?b>).)*)<\/b>/is';

但我希望能够匹配&lt;b class=”string”&gt;text&lt;/b&gt; 或内部的任何其他属性。 我已经在使用:

'/<b((\s)+?.*?)?\>(.*?)<\/b>/is'

但现在当尝试加入他们并添加新的否定前瞻时,我无法使其工作。

我试过'/&lt;b((\s)+?.*?)?\((?:(?!&lt;/?b((\s)+?.*?)?&gt;).)*)&lt;\/b&gt;/is'但不能正常工作,为此:

<b class=”string2”><b class=”string”>text</b></b>

它从第一个 b 标签开始匹配,它不应该。我想得到:

<b class=”string2”>[b]text[/b]</b>

【问题讨论】:

  • [强制正则表达式是解析html评论的错误工具]
  • 请张贴你想要的前后字符串。
  • @nfnneil 完成添加
  • @WillBarnwell 什么是正确的工具?
  • 美汤之类的html解析器

标签: php regex regex-negation


【解决方案1】:

这将所有 与 [b]:

<?php

$str = '<b>test</b><b class=”string2”><b class=”string”>text</b></b>';
$prev = '';
while ($prev != $str) {
    $prev = $str;
    $str = preg_replace("/<b[ a-z0-9\"'\=”]*?>(.*?)<\/b>/is","[b]$1[/b]",$str);
}
echo $str;

?>

【讨论】:

  • 我看到的第一个问题是它不适用于没有属性的 ,第二个问题是这匹配
    ,添加 但是第一个问题仍然存在。
  • 但现在 (.*?) 再次在中间,它不会按应有的方式解析 HTML,而不是从内到外匹配 HTML 标记,而是匹配第一个打开标记和第一个结束标记即使里面有更多的开放标签,这也不是 HTML 的工作方式。这是棘手的部分。
猜你喜欢
  • 2011-07-21
  • 1970-01-01
  • 2021-10-11
  • 2011-10-14
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多