正则表达式匹配给定的文本

时间:2017-07-18 13:17:50

标签: php regex preg-match

我有以下字符串

</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>&nbsp;</p>

模式是

<drupal-entity((?!<drupal-entity).)*?><\/drupal-entity><p>&nbsp;<\/p>

匹配很好,但有一些额外的性格 作为另一组" 我只想要匹配这个字符串

<drupal-entity data-view-mode="oembed_display"></drupal-entity><p>&nbsp;</p>

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

2 个答案:

答案 0 :(得分:1)

如果drupal-entity标签中没有标签,那么我的模式将提供高效的匹配。但是,如果drupal标记之间存在>的可能性很大,则无法信任我的模式。

所以我说,我的模式在速度准确性方面是妥协的,但我只是做出了妥协,因为示例输入文本没有显示内部标记 - 所以我正在运行一个假设。

模式:(Demo

@<drupal-entity[^>]+></drupal-entity><p>&nbsp;</p>@

答案 1 :(得分:1)

您的问题是如何避免匹配数组中的其他项目。请注意,只要模式包含捕获组,就会添加ID为1及以上的项目。捕获组是用一对未转义的括号制作的。

您的模式包含((?!<drupal-entity).)*? tempered greedy token,您使用(...)创建了一个捕获组。此模式匹配任何char(.并将其捕获到Group 1 (创建一个附加项),这不是<drupal-entity子字符串的起点,并匹配0这些字符中的+尽可能少(因此,它与@mickmackusa建议的模式不同,它将匹配第一个></drupal-entity><p>&nbsp;</p>子字符串。这意味着它不会处理嵌套标记,请注意。

如果可能,请使用HTML解析器

要解决此问题,您需要使用non-capturing替换捕获组,并且它已经产生了所需的结果:(?:(?!<drupal-entity).)*?(请注意在初始后添加的?: ()。