php - 正则表达式在正则表达式中第一次出现#STRING# 时停止

标签 php regex

*注意: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&nbsp;</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&nbsp;
</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, NG)。您可以使用 negative lookahead在重复的每个位置:

(?:(?!A_STRING).)*

(将此替换为 .*.*?)。在大多数情况下它应该是等价的,但执行时间可能不同。另外,它更难破译。

关于php - 正则表达式在正则表达式中第一次出现#STRING# 时停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13842078/

相关文章:

php - Symfony 3 形式 : how to set default value for a textarea widget

php - 服务器端缩小导致高流量站点上的 PHP 进程瓶颈。我有哪些选择?

php - 仅从字符串返回 0-9 和破折号

javascript - 正则表达式在字符的第三个实例之后获取内容

javascript - 尝试让 "perfect URL validation regex"在 ruby​​ 和 javascript 中工作

Java正则表达式如何从字母数字字符串中获取2个十进制值

php - 从mysql数据库多表中获取最新记录

php - 在 Codeigniter 中的所有 Controller 上具有固定 View

php - 无法在 "localhost"端口 25 连接到邮件服务器

javascript - 正则表达式在我的代码中似乎无法正常工作