我有以下字符串
</p><drupal-entity data-view-mode="oembed_display"></drupal-entity><p><strong>Designer Crush:</strong></p><drupal-entity data-view-mode="oembed_display"></drupal-entity><p> </p>
模式是
<drupal-entity((?!<drupal-entity).)*?><\/drupal-entity><p> <\/p>
匹配很好,但有一些额外的性格
作为另一组"
我只想要匹配这个字符串
<drupal-entity data-view-mode="oembed_display"></drupal-entity><p> </p>
答案 0 :(得分:1)
如果drupal-entity标签中没有标签,那么我的模式将提供高效的匹配。但是,如果drupal标记之间存在>
的可能性很大,则无法信任我的模式。
所以我说,我的模式在速度准确性方面是妥协的,但我只是做出了妥协,因为示例输入文本没有显示内部标记 - 所以我正在运行一个假设。
模式:(Demo)
@<drupal-entity[^>]+></drupal-entity><p> </p>@
答案 1 :(得分:1)
您的问题是如何避免匹配数组中的其他项目。请注意,只要模式包含捕获组,就会添加ID为1及以上的项目。捕获组是用一对未转义的括号制作的。
您的模式包含((?!<drupal-entity).)*?
tempered greedy token,您使用(...)
创建了一个捕获组。此模式匹配任何char(.
)并将其捕获到Group 1 (创建一个附加项),这不是<drupal-entity
子字符串的起点,并匹配0这些字符中的+尽可能少(因此,它与@mickmackusa建议的模式不同,它将匹配第一个></drupal-entity><p> </p>
子字符串。这意味着它不会处理嵌套标记,请注意。
如果可能,请使用HTML解析器。
要解决此问题,您需要使用non-capturing替换捕获组,并且它已经产生了所需的结果:(?:(?!<drupal-entity).)*?
(请注意在初始后添加的?:
(
)。