*注意:Array() 的输出是一个 PHP print_r()*
我有这个 HTML 标签:
<tr>
<td width="40" align="left"><div class="icSkill" id="skill4"></div></td>
<td colspan="2">SOME_VALUE_I_WANT </td>
</tr>
我真的想用 RegEx 提取它,在这种情况下不想使用 HTML 解析器。
我这样做正则表达式(我使用 s-flag 忽略文件的换行符):
\<tr\>\<td\swidth="40"\salign="left"\>\<div\s+class="icSkill"\s+id="skill(\d+)".*\<\/tr\>
现在的问题是正则表达式不会在找到第一个关闭的 TR 标记时停止,但我希望它停止。我知道它可能与断言有关,只是我不知道如何去做。
Array
(
[0] => <tr><td width="40" align="left"><div class="icSkill" id="skill4"></div></td><td colspan="2">SOME_VALUE_I_WANT
</td></tr><tr><td rowspan="2" align="left"><div class="icGuard" id="guard9"></div></td></tr>
[1] => 4
)
像这样的基本示例:/[^<]*/在这种情况下将不起作用。还有一种方法可以告诉正则表达式,例如:
/[^A_STRING]*/ (in words; stop unless you find A_STRING)
OR BETTER EXAMPLE:
/[^A_STRING_FIRST_TIME]*/ (in words; stop unless you find A_STRING for the FIRST_TIME)
最佳答案
问题是greediness . .*
尽可能多地消耗。您可以通过附加 ?
使其不贪婪:
~<tr><td\s+width="40"\s+align="left"><div\s+class="icSkill"\s+id="skill(\d+)".*?</tr>~s
另外,如你所见,真的没有必要做那么多的转义。它只会妨碍可读性。
另一种使重复变得不贪婪的方法是使用修饰符 U
,这使得整个模式中的所有重复都变得不贪婪。不过,我更喜欢本地变体(使用 ?
)。
在任何情况下,都有一种模仿 [^A_STRING]*
的不同可能性(这是行不通的,因为它匹配任何不包含 A< 的字符串
, _
, S
, T
, R
, I
, N
或 G
)。您可以使用 negative lookahead在重复的每个位置:
(?:(?!A_STRING).)*
(将此替换为 .*
或 .*?
)。在大多数情况下它应该是等价的,但执行时间可能不同。另外,它更难破译。
关于php - 正则表达式在正则表达式中第一次出现#STRING# 时停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13842078/