【问题标题】:how to "regex" all options in select menu如何“正则表达式”选择菜单中的所有选项
【发布时间】:2019-01-17 16:29:06
【问题描述】:

样本数据是这样的:

<select name="ctl00$ContentPlaceHolder1$UrunListesi$ctrl0$StokBoyut" id="ctl00_ContentPlaceHolder1_UrunListesi_ctrl0_StokBoyut">
<option value="900061_50x80">50x80 Stok:0</option>
<option value="900067_60x110">60x110 Stok:0</option>
<option value="900037_70x140">70x140 Stok:0</option>
<option value="356593_80 T.Yolluk">80 T.Yolluk Stok:2</option>
<option value="356552_80x150">80x150 Stok:23</option>
</select>

使用以下代码,我只能捕获一个数据:

$regex_select = '/<select name="ctl00\$ContentPlaceHolder1\$UrunListesi\$ctrl([0-9]{1,2})\$StokBoyut" id="ctl00_ContentPlaceHolder1_UrunListesi_ctrl([0-9]{1,2})_StokBoyut">(.*?)/msi';
preg_match_all($regex_select, $get, $d);

如何将所有数据捕获到“SIZExSIZE”(例如 50x80 或 150x230)和“Stock: [0-9]”直到最后一个 Select。

【问题讨论】:

标签: php regex select options capture


【解决方案1】:

应该尝试使用DOMDocument 对象。

<?php

$html = '<select name="ctl00$ContentPlaceHolder1$UrunListesi$ctrl0$StokBoyut" id="ctl00_ContentPlaceHolder1_UrunListesi_ctrl0_StokBoyut">
<option value="900061_50x80">50x80 Stok:0</option>
<option value="900067_60x110">60x110 Stok:0</option>
<option value="900037_70x140">70x140 Stok:0</option>
<option value="356593_80 T.Yolluk">80 T.Yolluk Stok:2</option>
<option value="356552_80x150">80x150 Stok:23</option>
</select>';
$html  = '<html>'. $html . '</html>';

/*** a new dom object ***/
$dom = new DOMDocument();

/*** load the html into the object ***/
$dom->loadHTML($html);
$pattern = '@\d+x\d+@s'; // Format: (number)x(number)
$stokPattern = '@(Stok:)\d+@s';
foreach ($dom->getElementsByTagName('option') as $row) {
    $attributeValue = $row->getAttribute('value');
    preg_match_all($pattern, $attributeValue);
    if (preg_match($pattern, $attributeValue, $match)) {
        echo $match[0] . '<br/>';
    }

    $text = $row->textContent;
    if (preg_match($stokPattern, $text, $match)) {
        echo $match[0] . '<br/>';
    }
    //echo $row->getAttribute('value') . '<br/>'; //Get value
    //echo $row->textContent . '<br/>'; // Get text
}

示例结果:

50x80
Stok:0
60x110
Stok:0
70x140
Stok:0
Stok:2
80x150
Stok:23

【讨论】:

    【解决方案2】:

    只需将(.*) 更改为([\s\S]*?)&lt;\/select&gt;

    所以完整的正则表达式是:&lt;select name="ctl00\$ContentPlaceHolder1\$UrunListesi\$ctrl([0-9]{1,2})\$StokBoyut" id="ctl00_ContentPlaceHolder1_UrunListesi_ctrl([0-9]{1,2})_StokBoyut"&gt;([\s\S]*?)&lt;\/select&gt;

    Demo

    . 不匹配新行,因此您可以使用 [\s\S] 代替匹配任何内容。

    一旦你有了你想要的select。使用额外的正则表达式 value=".*?_(\d+(?:x\d+)?)"&gt;.*?Stok:(\d+) 获取大小和库存值(第一和第二个捕获组)

    例如:

    <?php
    $re = '/<select name="ctl00\$ContentPlaceHolder1\$UrunListesi\$ctrl([0-9]{1,2})\$StokBoyut" id="ctl00_ContentPlaceHolder1_UrunListesi_ctrl([0-9]{1,2})_StokBoyut">([\s\S]*?)<\/select>/mi';
    $str = '
    <select name="ctl00$ContentPlaceHolder1$UrunListesi$ctrl0$StokBoyut" id="ctl00_ContentPlaceHolder1_UrunListesi_ctrl0_StokBoyut">
    <option value="900061_50x80">50x80 Stok:0</option>
    <option value="900067_60x110">60x110 Stok:0</option>
    <option value="900037_70x140">70x140 Stok:0</option>
    <option value="356593_80 T.Yolluk">80 T.Yolluk Stok:2</option>
    <option value="356552_80x150">80x150 Stok:23</option>
    </select>
    
    <select>
    <option value="dontwantthis">xxxx</option>
    </select>
    
    <select name="ctl00$ContentPlaceHolder1$UrunListesi$ctrl0$StokBoyut" id="ctl00_ContentPlaceHolder1_UrunListesi_ctrl0_StokBoyut">
    <option value="900061_50x80">50x80 Stok:0</option>
    <option value="900067_60x110">60x110 Stok:0</option>
    <option value="900037_70x140">70x140 Stok:0</option>
    <option value="356593_80 T.Yolluk">80 T.Yolluk Stok:2</option>
    <option value="356552_80x150">80x150 Stok:23</option>
    </select>
    
    ';
    
    preg_match_all($re, $str, $matches);
    
    foreach ($matches[0] as $select) {
        print "I like this select:______________\n";
        print $select . "\n";
        print "The values are:**********\n";
        preg_match_all('/value=".*?_(\d+(?:x\d+)?)[^"]*">.*?Stok:(\d+)/', $select, $values, PREG_SET_ORDER);
        foreach ($values as $value) {
            print "  - $value[1] and Stock=$value[2]\n";
        }
        print "\n\n";
    }
    

    看到它在行动here。

    结果

    The values are:
      - 50x80 and Stock=0
      - 60x110 and Stock=0
      - 70x140 and Stock=0
      - 80 and Stock=2
      - 80x150 and Stock=23
    

    【讨论】:

    • 谢谢。有没有办法提取Option中的数据?
    • 我更新了我的答案,添加了一个关于如何提取值的示例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多