0

我正在尝试将多行 HTML 源代码与正则表达式匹配(使用 AutoIt)。要匹配的 HTML 源代码:

<li class="mission">
    <div>
        <div class="missionTitle">
            <h3>Eat a quarter-pounder with cheese</h3>
            <div class="missionProgress">
                <span>100%</span>
                <div class="missionProgressBar" style="width: 100%;"></div>
            </div>
        </div>
        <div class="missionDetails">
            <ul class="missionRewards">
                <li class="rewardCash">5,000&ndash;8,000</li>
                <li class="rewardXP">XP +5</li>
                                </ul>
                            <div class="fightItems clearfix">
                <h5><span>Prerequisites:</span></h5>
                                    <div class="fightItemsWrap">
                                            <div class="fightItem tooltip" title="Sunglasses" data-attack="Attack: 2" data-defence="Defence: 2">
                        <img src="/img/enhancement/3.jpg" alt="">
                        <span>&times; 1</span>
                    </div>
                                            <div class="fightItem tooltip" title="Broad Shoulders" data-attack="Attack: 0" data-defence="Defence: 3">
                        <img src="/img/enhancement/1003.jpg" alt="">
                        <span>&times; 1</span>
                    </div>
                                            <div class="fightItem tooltip" title="Irish Fond Anglia" data-attack="Attack: 4" data-defence="Defence: 8">
                        <img src="/img/enhancement/2004.jpg" alt="">
                        <span>&times; 1</span>
                    </div>
                                        </div>
            </div>
                            <form action="/quest/index/i/kdKJBrgjdGWKqtfDrHEkRM2duXVn1ntH/h/c0b2d58642cd862bfad47abf7110042e/t/1336917311" method="post">
                <input type="hidden" id="id" name="id" value="17"/>
                <button class="button buttonIcon btnEnergy"><em>5</em></button>
            </form>
        </div>
    </div>
</li>

它在一个页面上出现多次(但其中的项目<div class="fightItems clearfix">...</div>有所不同)。

  • 我需要匹配
    • <h3>Eat a quarter-pounder with cheese</h3>,
    • 第一个跨度<span>100%</span>
    • <input type="hidden" id="id" name="id" value="17"/>.

预期结果(对于页面上的每次出现):

$a[0] = "Eat a quarter-pounder with cheese"
$a[1] = "100%"
$a[2] = "17"

我想出了什么:

(?U)(?:<div class="missionTitle">\s+<h3>(.*)</h3>\s+<div class="missionProgress">\s+<span>(.*)</span>)|(?:<form .*\s+.*<input\stype="hidden"\sid="id"\sname="id"\svalue="(\d+)"/>\s+.*\s+</form>)

但这会使一些数组项为空。我也尝试了该(?s)标志,但它只捕获第一次出现(并在之后停止匹配)。

4

2 回答 2

1

.由于(?s)标志,我不必使用匹配单词或整数。正确的正则表达式是:

(?U)(?s)<div class="missionTitle">\s+<h3>([\w\s]+)</h3>(?:.*)<div class="missionProgress">\s+<span>(\d+)%</span>(?:.*)<input.* value="(\d+)"/>
于 2013-09-23T13:28:12.663 回答
0

正则表达式匹配多行 HTML 源代码:

  • 根据文档

    • \R匹配换行符(?>\r\n|\n|\r)
    • dot.不会(除非(?s)已设置)。
    • \s匹配空白字符。
  • 通常需要一些组合(如\R\s*?)。

  • 非捕获组是多余的(匹配而不捕获)。
  • 如果被唯一地括起来,则可能会排除单个字符(例如attribute="([^"]*?)"双引号之间的文本)。

示例(包含双引号;按文档处理 - 常见问题解答 - 双引号):

(?s)<div class="missionTitle">.*?<h3>(.*?)</h3>.*?<div class="missionProgress">.*?<span>([^<]*?)</span>.*?<input type="hidden" id="id" name="id" value="([^"]*?)"/>

视觉解释:

正则表达式图片 正则表达式图片

如果应该在 HTML 上使用正则表达式(除了像这样的简单列表)是一个不同的问题(been、done、T-shirt)。

于 2017-06-04T23:11:41.973 回答