正则表达式找到非贪婪的模式

时间:2015-10-19 17:10:34

标签: php regex pcre

我有一个简单的答案,但无法理解这一点。我有这个多行文字:

<p class='testing1_class'><span>Lorem Ipsum SomePhrase1 Lorem Lorem Lorem</span></p>
<p class='testing2_class'><span>Lorem Ipsum SomePhrase2 Lorem Lorem Lorem</span></p>
<p class='testing1_class'><span>Lorem Ipsum SomePhrase1 Lorem Lorem Lorem</span></p>

我想做的是找到所有条款&#34; SomePhrase1&#34;在单<p>内,不重叠。

这是我得到的模式,它是重叠的。

<p.*?_class'><span.*?(SomePhrase1).*?<\/p>\n

属性:/ isg

有人可以帮帮我吗?非常感谢!

2 个答案:

答案 0 :(得分:0)

与此类问题一样,XML / HTML的最佳选择是使用XML或HTML解析器。

如果您坚持使用正则表达式:

这应该适用于您的输入类似于示例的情况:

DataGridView

如果您需要进一步限制它,可以使用此正则表达式:

(?<=<span>Lorem Ipsum ).*?(?= Lorem Lorem Lorem<\/span>)

如果您使用的是没有外观功能的正则表达式,只需替换为捕获组并选择第二个:

(?<=<p class='testing\d_class'><span>Lorem Ipsum ).*?(?= Lorem Lorem Lorem<\/span>)

(<span>Lorem Ipsum )(.*?)( Lorem Lorem Lorem<\/span>)

答案 1 :(得分:0)

PHP(或使用PCRE)等语言具有\K令牌,这意味着&#34;重置目前为止的匹配。&#34;这意味着您可以非常明确地指出在您想要匹配的部分之前应该出现的文本,重置匹配以及您的正则表达式光标&#34;将在那部分之后开始。

您可以看到此示例here,其中首先找到<p>元素,并且在匹配任何其他<...>元素后,\K用于重置匹配。如您所见,捕获的文本仅突出显示SomePhrase1是否存在。

修改

您可能需要考虑许多边缘情况,其中XML / HTML完全失败:

<p class='testing1_class'><span>Lorem Ipsum SomePhrase1 Lorem Lorem Lorem</span></p>
<p class='testing2_class'><span>Lorem Ipsum SomePhrase2 Lorem Lorem Lorem</span></p>
<p class='testing1_class'><span>Lorem Ipsum SomePhrase1 Lorem Lorem Lorem</span></p>
<span><p class="testing2_class"><p>Lorem Ipsum SomePhrase1 Lorem Lorem Lorem</p></p></span>
Lorem Ipsum SomePhrase1 Lorem Lorem Lorem
<span class='testing1_class'>Lorem Ipsum SomePhrase1 Lorem Lorem Lorem</span>
<p>Lorem Ipsum SomePhrase1 Lorem Lorem Lorem</p>
<p style='color: black;' class='foo bar testing1_class baf' id='#magic'>Lorem Ipsum SomePhrase1 Lorem Lorem Lorem</p>
<p class='testing1_class'>Lorem Ipsum <span>SomePhrase1</span> Lorem Lorem Lorem</p>
<p class='testing1_class'>Lorem Ipsum Lorem Lorem Lorem</p>
<p class='testing1_class'>Lorem <p>Ipsum SomePhrase1 Lorem</p> Lorem Lorem</p>
<p class='testing1_class'>SomePhraseX</p><p class='testing1_class'>WrongPhrase</p><p class='testing1_class'>Another Wrong Phrase</p>

处理所有这些案件的正则表达式非常脆弱,而且会变得非常复杂。然而,jQuery将允许您更简单地访问它:JSFIDDLE