PHP Preg匹配捕获组



我似乎无法掌握php中的正则表达式。具体来说,是组捕获部分。

我有一个像这样的字符串

<table cellpadding="0" cellspacing="0" border="0" width="100%" class="List">
  <tr class='row_type_1'>
    <td class="time">
                      3:45 pm
    </td>
    <td class="name">
                      Kira
    </td>
  </tr>
  <tr class='row_type_2'>
    <td class="time">
                      4:00 pm
    </td>
    <td class="name">
                      Near
    </td>
  </tr>
</table>

我希望我的数组是这样的

Array
(
   [0] => Array
   (
      [0] => 3:45 pm
      [1] => Kira
   )
   [1] => Array
   (
      [0] => 4:00 pm
      [1] => Near
   )
)

我只想使用preg_match,而不是explosion, array_keys或loops。我花了一段时间才弄清楚,我需要一个/s来表示。*来计算换行;我真的很想看看模式和捕获语法。

编辑:模式只需要(row_type_1|row_type_2)这样的东西来捕获我想要从中获取数据的表中仅有的两种类型的行。例如,在row_type_2之后是row_type_3,然后是row_type_1,那么row_type_3将被忽略,数组将只添加来自row_type_1的数据,如下所示。

Array
(
   [0] => Array
   (
      [0] => 3:45 pm
      [1] => Kira
   )
   [1] => Array
   (
      [0] => 4:00 pm
      [1] => Near
   )
   [2] => Array
   (
      [0] => 5:00 pm
      [1] => L
   )
)

我将使用XPath和DOM从HTML检索信息。如果HTML或查询变得更复杂,使用正则表达式可能会变得混乱。(如您目前所见)。DOM和XPath是这方面的标准。为什么不用呢?

想象一下这个代码示例:

// load the HTML into a DOM tree
$doc = new DOMDocument();
$doc->loadHtml($html);
// create XPath selector
$selector  = new DOMXPath($doc);
// grab results
$result = array();
// select all tr that class starts with 'row_type_'
foreach($selector->query('//tr[starts-with(@class, "row_type_")]') as $tr) {
    $record = array();
    // select the value of the inner td nodes
    foreach($selector->query('td[@class="time"]', $tr) as $td) {
        $record[0]= trim($td->nodeValue);
    }
    foreach($selector->query('td[@class="name"]', $tr) as $td) {
        $record[1]= trim($td->nodeValue);
    }
    $result []= $record;
}
var_dump($result);

不应该使用正则表达式解析html,原因如下:最大的原因是很难解释格式不佳的html,并且可能会变得又大又慢。

我建议使用php DOM解析器或php HTML解析器。

试试这个:

function extractData($str){
    preg_match_all("~<tr class='row_type_d'>s*<td class="time">(.*)</td>s*<td class="name">(.*)</td>s*</tr>~Usim", $str, $match);
    $dataset = array();
    array_shift($match);
    foreach($match as $rowIndex => $rows){
        foreach ($rows as $index => $data) {
            $dataset[$index][$rowIndex] = trim($data);
        }
    }
    return $dataset;
}
$myData = extractData($str);

地狱之路就在这里:

$pattern = '`<tr .*?"time">s++(.+?)s++</td>.*?"name">s++(.+?)s++</td>`s';
preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER);
foreach ($matches as &$match) {
    array_shift($match);
}
?><pre><?php print_r($matches);

相关内容

  • 没有找到相关文章

最新更新